SQL Server使用order by子句可显着提高选择性能

时间:2018-06-29 01:21:41

标签: sql sql-server

我直接在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

作为参考,表A-F和G约为1000行,表G约为10000行。

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

然后我添加一个

ORDER BY Id1 ASC
语句末尾的

,现在大约需要6秒钟才能运行。如何添加排序可以显着改善这样的性能?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

在检查了执行计划之后,似乎问题出在表A和表G上的JOIN上。最初,优化器正在尝试使用嵌套循环联接,这对于其大小的表而言效率非常低。向优化器添加ORDER BY子句会提示优化器改用合并联接,这要快得多。感谢您的回答!