我需要编写一个查询来检索一个大的 id 列表。
我们确实支持许多后端(MySQL、Firebird、SQLServer、Oracle、PostgreSQL …),所以我需要编写一个标准 SQL。
id 集的大小可能很大,查询将以编程方式生成。那么,最好的方法是什么?
SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)
我的问题是。如果 n 很大会怎样?另外,性能怎么样?
SELECT * FROM TABLE WHERE ID = id1 OR ID = id2 OR ... OR ID = idn
我认为这种方法没有 n 限制,但是如果 n 非常大,性能呢?
foreach (var id in myIdList) { var item = GetItemByQuery("SELECT * FROM TABLE WHERE ID = " + id); myObjectList.Add(item); }
当通过网络查询数据库服务器时,我们遇到了这种方法的一些问题。通常做一个检索所有结果的查询比做很多小查询要好。也许我错了。
这个问题的正确解决方案是什么?
选项 1 是唯一好的解决方案。
选项 2 的作用相同,但您多次重复列名;此外,SQL 引擎不会立即知道您要检查该值是否是固定列表中的值之一。但是,一个好的 SQL 引擎可以对其进行优化,使其具有与IN. 仍然存在可读性问题…
IN
选项 3 在性能方面简直太糟糕了。它在每个循环中发送一个查询,并用小查询锤击数据库。它还阻止它对“值是给定列表中的值之一”使用任何优化