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,则立即执行.关于如何优化的任何想法?
要做的一件事就是查看优化器计划(如果可以的话)并查看当您使用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为中心的,但同样的原则应该适用于大多数数据库.
将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)
归档时间: |
|
查看次数: |
332 次 |
最近记录: |