首页 > 解决方案 > SQL Server 使用 order by 子句显着提高了选择性能

问题描述

我在 SQL Server 中直接执行以下查询:

   SELECT *
     FROM TableA
LEFT JOIN TableB 
       ON TableB.field1 = TableA.field1
LEFT JOIN TableC 
       ON TableC.field2 = TableA.field2
LEFT JOIN TableD 
       ON TableD.field3 = TableA.field3
LEFT JOIN TableE 
       ON TableE.field4 = TableA.field4
LEFT JOIN TableF 
       ON TableF.field5 = TableA.field5
LEFT JOIN 
          (SELECT *
             FROM 
                (SELECT 
                       Id1, Id2,
                       UpdateDate,
                       ROW_NUMBER() OVER(PARTITION BY Id1, Id2, 
               ORDER BY UpdateDate DESC) AS RN 
                   FROM TableG) AS G 
           WHERE G.RN = 1) TableH 
     ON TableA.Id1 = TableH.Id2 
    AND TableA.Id1 = TableH.Id2

作为参考,表 AF 和 G 大约有 1000 行,表 G 大约有 10000 行。

对于特定输入,此查询大约需要 1 分钟才能运行。

然后我添加一个

ORDER BY Id1 ASC

在语句结束时,现在运行大约需要 6 秒。添加排序如何显着提高这样的性能?

标签: sqlsql-server

解决方案


在查询的两个版本上运行一个显示计划。

可能正在发生的事情是排序强制执行不同的查询计划,该计划对您的特定数据连接策略(可能在内存中)使用更高效,但估计成本更高。


推荐阅读