在SQLite WHERE子句中组合了大量条件

时间:2012-01-27 23:34:00

标签: sql performance sqlite

我需要检索与列表中存储的ID匹配的记录。在运行时生成的查询很简单:

SELECT [whatever FROM sometable] WHERE (id = 1) or (id = 5) or (id = 33).

相当于

SELECT [whatever FROM sometable] WHERE [id] IN (1, 5, 33);

这很好,但是如果列表包含数百或数千个ID怎么办?声明将是巨大的,并且在某些时候SQL解析器可能会呱呱叫,或者如果它没有,性能可能会非常糟糕。 如何以对检索记录数量不敏感的方式执行此操作?

(我不能只是循环遍历列表并逐个检索记录的原因是我需要数据库为我做ORDER BY。记录必须来自特定字段排序的数据库,而列表表示用户在网格中选择的记录,可以通过多种方式进行排序。是的,我可以在检索后对代码中的记录进行排序,但那是B计划,因为我甚至不需要保留它们都在一个数据结构中,只是为了正确排序。)

5 个答案:

答案 0 :(得分:5)

如果您真的想拥有这么多ID,而您担心SQL解析器会出现问题,那么您可以将它们存储到临时表中并进行交叉连接。

只需使用一个(主键)列创建表,然后使用所需的ID填充它,并使用以下内容:

SELECT [whatever] FROM [sometable] st, [idtable] it
WHERE st.id = it.id

该查询不会阻塞任何解析器,并且检索到的行将仅限于临时表中具有ID的行。

这不是作为临时表格,当然,如果您确保一次只有一个“东西”使用它,您可以将它放在周围。

答案 1 :(得分:1)

您可以将这些项目添加到表中,然后加入它吗?

SELECT Whatever FROM TableA CROSS JOIN TableB ON TableA.ID = TableB.ID

答案 2 :(得分:0)

据推测,确定要检索的ID列表有一些逻辑,这个逻辑是不是可以合并到where子句中?也许您可以加入一个包含某种会话ID以及所需ID的表?

答案 3 :(得分:0)

如果where子句中的值在表中,则可以执行此操作。

select id from foo where id in (select id from bar)

答案 4 :(得分:0)

您的编程语言应支持准备好的查询,即

 SELECT [whatever FROM sometable] WHERE (id = ?);

或:

 SELECT [whatever FROM sometable] WHERE (id = @id);

通过准备查询,查询可用于重复使用,您可以将参数绑定到本机编程语言中的变量。如果此搜索频率很高,那么将这些准备好的查询保留一段时间是值得的。

这里有一个有用的讨论: