2012-08-02 23 views
1

我有一个需要产生的潜在数千where条件像(table1.a = ? OR table1.a = ? OR ...) AND (table2.b = ? OR table2.b = ? ...) AND....需要长期和动态的选择查询/查看源码

我最初开始构建一个类,使这个更惬意长选择查询,但此后停下来想知道这是否会奏效。这个查询将会敲击一张可能有数十万行的表格,其中有数以千计的行与另外两个表连接在一起。

一些担忧出于此:

1)我想用这些语句生成一个临时视图,以便我可以很容易地转移过来现有的代码库,这里的关键是我想过滤数据我根据GUI中选定的参数进行了分析,因此在这种情况下视图做得有多糟糕?

2)可SQLite的分析,甚至成千上万结合的查询?

3)是不是有一个框架,可以使产生这个查询比字符串连接更方便其他?

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

编辑:

新问题,就来到了我的注意,SQLITE3仅限于在编译时999个绑定值(主机参数)。

所以它好像只有这样才能完成我原本打算是

1)通过生成的字符串连接(我最关心的是整个查询,我不知道该怎么慢解析所有里面sqlite3的数据会)

2)执行毯查询方法(select * from * where index > ? limit ?)和调用next(),直到我打什么有效的数据在我的编译代码(包括更新索引变量和再多次查询)

我最终编写了一个QSqlQuery对象的包装器,该对象将使用index>变量和限制来遍历表以允许“走”该表。

+1

你想使用“的”语句,而不是一堆“=” S。 – 2012-08-02 21:45:48

+0

我想,但是我的其他问题仍然存在。 – 2012-08-02 21:47:18

+0

停止思考“一次一行”的模式。对于一个数据库来说,选择满足条件的所有元组比选择它们要容易得多。你在哪里(...)列表的来源是什么?你为一个目标执行两个查询吗? (一到拿到钥匙,第二次为实际内容) – wildplasser 2012-08-02 21:54:00

回答

0

考虑不带过滤器(非规格化)连接结果倾倒到平面文件和索引将其与Fastbit,位图索引引擎。

+0

sqlite是否不足以满足我的需求?数据库是预先生成的,传输数据需要花费时间,我无法修改生成数据的代码。 – 2012-08-02 23:46:21

+0

这取决于您在最大表格中匹配多少行。这限制了查询的执行时间。虽然您的应用程序可以并行执行查找,但这可能会显着加快速度。 – 2012-08-03 01:58:56

+0

为什么dbms系统不支持拉式esque观察者模式,如果我想按照索引顺序走一个表并且只有当我准备好时才需要每一行,我不能?所以如果我做了QSqlQuery.exec(“SELECT * FROM table ORDER BY index”),我必须等待DBMS做一些事情(没有?)10百万次,然后才能开始使用QSqlQuery.next来检查数据集()?并不是所有文件系统上都存在这样的命令,所以不应该在调用next()时根据需要读取行吗? – 2012-08-03 13:39:29