Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要长时间动态选择查询/查看sqlite_Sql_Performance_Sqlite_Qt_Database - Fatal编程技术网

需要长时间动态选择查询/查看sqlite

需要长时间动态选择查询/查看sqlite,sql,performance,sqlite,qt,database,Sql,Performance,Sqlite,Qt,Database,我需要生成一个长select查询,其中可能包含数千个,其中条件,如(table1.a=?或table1.a=?或…)和(table2.b=?或table2.b=?…)和… 我最初开始构建一个类,使其更容易接受,但后来我停下来想知道这是否会很好地工作。此查询将敲打一个可能包含1000万行的表,并与另外两个包含数千行的表连接 由此产生了许多问题: 1.)我想使用这些语句生成一个临时视图,这样我就可以轻松地在现有的代码基础上进行传输,这里的要点是我想根据GUI中的选定参数过滤数据以进行分析,那么在这种

我需要生成一个长select查询,其中可能包含数千个
,其中
条件,如
(table1.a=?或table1.a=?或…)和(table2.b=?或table2.b=?…)和…

我最初开始构建一个类,使其更容易接受,但后来我停下来想知道这是否会很好地工作。此查询将敲打一个可能包含1000万行的表,并与另外两个包含数千行的表连接

由此产生了许多问题:

1.)我想使用这些语句生成一个临时视图,这样我就可以轻松地在现有的代码基础上进行传输,这里的要点是我想根据GUI中的选定参数过滤数据以进行分析,那么在这种情况下视图的性能会有多差

2.)sqlite甚至可以解析具有数千个绑定的查询吗

3.)难道没有一个框架可以使生成此查询比使用字符串连接更容易吗

4.)更好的解决方案是将所有WHERE变量转储到内存中的哈希集中,然后为我的DB查询对象编写一个包装器,该包装器获取
next()
,直到遇到满足我所有条件的查询为止?我在这里担心的是,应用程序会按程序在卷轴上生成图形,因此在调用
query.next()
x 100000时等待绘制可能会导致恼人的延迟?理想情况下,我不想一次等待下一排满足所有要求的时间超过30毫秒

编辑:

新问题,我注意到sqlite3在编译时被限制为999个绑定值(主机参数)

因此,似乎要实现我最初的目标,唯一的办法就是

1.)通过字符串连接生成整个查询(我最担心的是,我不知道解析sqlite3中的所有数据有多慢)

2.)执行一揽子查询方法(
选择*from*where index>?limit?
)并调用next(),直到我在编译的代码中找到有效数据为止(包括更新索引变量和重复重新查询)


最后,我确实在QSqlQuery对象周围编写了一个包装器,它将使用index>变量和limit遍历一个表,以允许“遍历”该表。

考虑将不带过滤器(非规范化)的联接结果转储到一个平面文件中,并使用位图索引引擎对其进行索引

你想使用“in”语句,而不是一堆“=”s。我想,但我其余的担心仍然存在。停止以“一次一行”的模式思考。对于数据库来说,选择满足条件的所有元组要比逐个选择它们容易得多。(…)
列表中的
where字段的来源是什么。您是否为一个目标执行两个查询?(一个是获取键,第二个是获取实际内容)sqlite是否会使用这些大量in()语句进行有意义的优化,这比我选择所有并忽略不适合哈希集的行要好?@wildpasser,这些变量来自用户定义的过滤器,这些过滤器过滤出他们想要在此工具中分析的内容。对于“一次一行”注释,此工具查看的数据是“一次一行”,因为每个(过滤)行都成为屏幕上的图表对象,并且在滚动时数据库结果集是“一次一行”的,因为它不可能全部存储在内存中,也不可能在每个卷轴上重新查询。sqlite是否不足以满足我的需要?数据库是预先生成的,传输数据需要很长时间,我无法修改生成数据的代码。这取决于最大表中匹配的行数。这限制了查询的执行时间。但是,您的应用程序可以并行执行查找,这可以显著加快速度。为什么dbms系统不支持拉式观察者模式,如果我想按索引顺序遍历表,并且只想在准备就绪时查看每一行,我就不能这样做?因此,如果我执行了QSqlQuery.exec(“SELECT*fromtable ORDER BY index”),我必须等待DBMS执行(nothing?)1000万次,然后才能开始使用QSqlQuery.next()检查该数据集?文件系统上的所有内容不是都按我的要求排序的吗?因此,在调用next()时,它不应该根据需要读取行吗?因为在整个查找过程中,您会持有读取锁。一些RDBMS确实允许这样做。MySQL将允许您使用MySQL\u STORE\u RESULT在内存中缓冲查询结果并立即执行整个操作,或者MySQL\u使用\u RESULT将结果流式传输。也许SQLite也有类似的功能,但我对它还不太熟悉。出于所有密集的目的,数据集在创建后被认为是不可变的,所以如果这会减慢速度,我更愿意关闭所有锁定。