对于我要优化的中等复杂查询,我注意到删除该TOP n
子句会更改执行计划。我可能已经猜到,当查询中包含TOP n
数据库引擎时,该查询将忽略该TOP
子句而运行,然后最后仅将结果集缩减为所请求的n行。图形化的执行计划似乎表明是这种情况,这是TOP
“最后一步”。但似乎还有更多的事情正在进行。
我的问题是,TOP n子句如何(以及为什么)影响查询的执行计划?
这是我的情况的简化版本:
该查询匹配两个表A和B中的行。
如果没有该TOP
子句,优化器估计表A将有19k行,表B将有46k行。对于A,返回的实际行数是16k,对于B,返回的行数是13k。散列匹配用于将两个结果集连接到a总共69行(然后应用排序)。这个查询很快发生。
当我添加TOP 1001
优化器时,不使用哈希匹配;相反,它首先对表A的结果进行排序(相同的估计值/实际值为19k / 16k),并针对表B进行嵌套循环。表B的估计行数现在为1,奇怪的是,TOP n
直接影响表B 针对B的估计执行次数(索引查找)-始终为2n + 1,在我的情况下为2003。如果我更改,则此估计值也会相应更改TOP n
。当然,由于这是嵌套联接,因此实际执行次数为16k(表A中的行数),这会使查询速度变慢。
实际情况要复杂一些,但这捕获了基本思想/行为。使用索引查找来搜索两个表。这是SQL Server 2008 R2企业版。
FAST num_rows
查询提示。
ORDER BY
子句。TOP
在计划中的这种地方添加更改,但是我更担心它如何影响针对表B的索引查找的执行次数……(当然,这可能是相关的-我不知道)