SQL Server:SELECT TOP 1 vs SELECT TOP 2或更高速度问题

时间:2016-03-16 15:39:49

标签: sql-server

我发现SELECT TOP 1TOP 1更改为TOP 2TOP 10000等任何其他内容的查询时间差异很大。

TOP任何事情> 1毫秒运行,TOP 1在12分钟内运行。

这是查询的样子:

SELECT TOP ? 
    Column1, Column2, Column3,
    Column4, Column5, Column6,
    Column7,
    Column8 AS Column9,
    Column10, Column11,
    Column12 AS Column13,
    Column14,
    Object1.Column15 AS Column16,
    ? AS Column17,
    Column18
FROM
    Object2 Object1
INNER JOIN 
    CONTAINSTABLE(Object2, *, ?, ?) key_table ON Object1.Column19 = Object3.Column20
WHERE
    (Column6 IN (SELECT DISTINCT
                     Object4.Column21
                 FROM Object4
                 INNER JOIN Object5 ON Object4.Column22 = Object5.Column22
                 WHERE Object5.Column23 = ?
                   AND Object4.Column24 = ?))
ORDER BY 
    Column2 ASC;

如您所见,我正在通过表PK上的CONTAINSTABLE加入全文查询。我也在检查结果列是否在子选择中。我已在IN ()选择中完成了子选择,并将其更改为更多INNER JOIN。我表明这是因为它的代码方式。无论哪种方式都做同样的事情。

我发现的问题是执行计划。如果我要求TOP 2或更多,它将完全不同地加入WHERE列。您可以在Index Seek Object4.Index3中看到我添加的查询计划的不同之处。在top_issue_over_one中,只有2个搜索谓词。在top_issue_one中有3个,第三个是sub select中的列。当发生这种情况时,它将必须循环表以获取数据,每个表中可能有数百万条记录。您还可以从计划中看到那里的索引。它们都在所有列上都有索引。

为了回答几个问题,我会被主动询问,是的,排序列是索引的,是的,如果我把它取下来,它将在两者上快速运行。此外,如果我删除全文查询,它将在两者上快速运行。所有这一切的结合使它成为现实。

我很好奇是否有人看过这个,并且知道为什么它在TOP 1上对其他任何东西做出不同的计划?

1 个答案:

答案 0 :(得分:0)

根据查询过程中涉及的阶段,TOP表示过滤器,是最后一步,您是否可以测试另一个更改查询并添加

的方案
SET ROWCOUNT 1 

代替TOP 1并评估差异,另一件事是尝试应用

DBCC FREEPROCCACHE

显然在开发环境中。

相关问题