我发现SELECT TOP 1
与TOP 1
更改为TOP 2
或TOP 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上对其他任何东西做出不同的计划?
答案 0 :(得分:0)
根据查询过程中涉及的阶段,TOP表示过滤器,是最后一步,您是否可以测试另一个更改查询并添加
的方案SET ROWCOUNT 1
代替TOP 1并评估差异,另一件事是尝试应用
DBCC FREEPROCCACHE
显然在开发环境中。