SQL查询在"IN"子句中快速处理19项 - 与20相比慢得多.为什么?

Rag*_*oad 4 sql optimization sql-server-2005

我有一个查询,其中包括:

... AND Record.RecordID IN (1,2,3,10,11,12,13,16,17,18,26,27,28,557,31,32,33,36,37,93) AND ...
Run Code Online (Sandbox Code Playgroud)

问题似乎是如果该列表中有20个或更多项,则查询需要超过25秒才能执行.如果少于20,则立即执行.关于如何优化的任何想法?

dcp*_*dcp 9

要做的一件事就是查看优化器计划(如果可以的话)并查看当您使用20项或更少项目时计划有何不同与20项相比.例如,在Oracle中,您可以使用explain plan命令查看这个输出.

以下是有关如何在Oracle中使用解释计划的一些信息:http: //download.oracle.com/docs/cd/B10501_01/server.920/a96533/ex_plan.htm

其他需要考虑的事项是您是否在RecordID上有索引.可能是一旦你越过某个阈值(在你的情况下超过20个项目),优化器就会决定使用全表扫描而不是使用你的索引.

有时,对于某些数据库,您可以使用优化程序提示来说服优化程序使用索引,如果确实可以获得更好的性能.

以下是您可以阅读的优化程序提示的链接:http: //download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm

我的答案是以Oracle为中心的,但同样的原则应该适用于大多数数据库.


And*_*mar 9

将RecordID放在临时表中,并使用一个inner join过滤它们.对于SQL Server,它看起来像:

declare @RecordIds table (int RecordID)
insert into @RecordIds values (1)
insert into @RecordIds values (2)
...
insert into @RecordIds values (93)

select r.*
from Records r
inner join @RecordIds ri on ri.RecordID = r.RecordID
Run Code Online (Sandbox Code Playgroud)