【发布时间】:2011-08-13 19:01:55
【问题描述】:
我需要编写一个查询来检索一个大的 id 列表。
我们确实支持许多后端(MySQL、Firebird、SQLServer、Oracle、PostgreSQL ...),所以我需要编写一个标准 SQL。
id 集的大小可能很大,查询将以编程方式生成。那么,最好的方法是什么?
1) 使用 IN 编写查询
SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)
我的问题是。如果 n 很大会怎样?另外,性能怎么样?
2) 使用 OR 编写查询
SELECT * FROM TABLE WHERE ID = id1 OR ID = id2 OR ... OR ID = idn
我认为这种方法没有n的限制,但是如果n很大的话性能呢?
3) 编写程序化解决方案:
foreach (var id in myIdList)
{
var item = GetItemByQuery("SELECT * FROM TABLE WHERE ID = " + id);
myObjectList.Add(item);
}
当通过网络查询数据库服务器时,我们遇到了这种方法的一些问题。通常,做一个检索所有结果的查询比做很多小查询要好。也许我错了。
这个问题的正确解决方案是什么?
【问题讨论】:
-
选项 1 显着减少了 SQL 服务器响应时间,选择了 7k 个 ID,其中一些不存在。通常查询大约需要 1300 毫秒,使用
IN可以减少到 80 毫秒!我将我的作为您的解决方案 1 + 3。只是最后一个查询是一个发送到 SQL 执行的长查询字符串。