首页 > 解决方案 > 使用 TOP 和 ORDER BY 的查询非常慢

问题描述

我在 SQL Server 2014 中有一个查询,当我执行它时需要很长时间才能得到结果。

当我删除TOPorORDER BY指令时,它执行得更快,但是如果我同时编写它们,则需要很多时间。

SELECT TOP (10) A.ColumnValue AS ValueA
FROM TableA AS A
    INNER JOIN TableB AS B
        ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA

我怎样才能让它更快?

标签: sqlsql-servertsqlinner-jointop-n

解决方案


你说

当我删除 TOPORDER BY ... 它执行得更快

这表明 SQL Server 按所需顺序生成整个结果集没有问题。它只是梨形,限制为TOP 10. 这是rowgoals的常见问题。当 SQL Server 知道您只需要前几个结果时,它可以选择一个不同的计划来尝试针对这种可能适得其反的情况进行优化。

更新的版本包括在DISABLE_OPTIMIZER_ROWGOAL每个查询的基础上禁用此功能的提示。在旧版本上,您可以使用QUERYTRACEON 4138如下。

SELECT TOP (10) A.ColumnValue AS ValueA
FROM TableA AS A
    INNER JOIN TableB AS B
        ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
OPTION (QUERYTRACEON 4138) 

您可以使用它来验证原因,但可能会发现运行权限QUERYTRACEON是一个问题。

在那种情况下,您可以将TOP值隐藏在变量中,如下所示

DECLARE @Top INT = 10

SELECT TOP (@Top) A.ColumnValue AS ValueA
FROM TableA AS A
    INNER JOIN TableB AS B
        ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
option (optimize for (@Top = 1000000))

推荐阅读