SQL:SELECT IN更快更好的做法?

时间:2009-08-03 01:55:08

标签: sql

如果我使用2个查询:

首先:查询所需的所有键/ ID

第二:从tab1中选择*,其中tab1.id在(... ids list .. ,,)

ids列表可能有数千......

是明智的还是最佳的做法,还是建议做那样的事情?

2 个答案:

答案 0 :(得分:7)

作为一般规则,在语句中使用IN子句是完全可以接受的最佳实践...假设您使用子查询来处理更大的值集。

答案应始终如下:取决于!从您的问题中不清楚您的值列表是否是SELECT,或者您是否对它们进行硬编码。如果数千个值存在于另一个表(临时表或表变量)中并且您将它们取消了它们,那肯定会更高效。即。

    SELECT * FROM Customer 
    WHERE CustomerID IN (SELECT ID FROM MyOtherLargeTableOfCustomers)
  • 您正在执行该IN子句的列
  • 的索引程度如何?
  • 数据类型是什么?如果是数字数据类型,则不应出现任何性能问题。
  • 确保您的STATISTICS(如果SQL Server)定期更新。
  • 如果数据类型是基于字符的,或者是guid,则可能会遇到一些性能问题,尤其是当您同时运行多个查询时,如您所述,列表数量为数千个。
  • 考虑JOIN这些表格;应始终产生更快的查询。
SELECT * FROM Customer AS C 
INNER JOIN MyOtherLargeTableOfCustomers AS M
ON C.CustomerID = M.CustomerID

答案 1 :(得分:1)

如果您的ID在可连接表中是可查询的,则使用内部联接应该为您提供最快的查询,并为您提供一个小得多的查询以发送到数据库。