我直接在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秒钟才能运行。如何添加排序可以显着改善这样的性能?
答案 0 :(得分:0)
在两个版本的查询上运行显示计划。
发生的事情可能是排序迫使不同的查询计划,该查询计划对您的特定数据联接策略(可能是内存中的)使用更高的效率,但估计成本更高。
答案 1 :(得分:0)
在检查了执行计划之后,似乎问题出在表A和表G上的JOIN上。最初,优化器正在尝试使用嵌套循环联接,这对于其大小的表而言效率非常低。向优化器添加ORDER BY子句会提示优化器改用合并联接,这要快得多。感谢您的回答!