sql - 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 秒。添加排序如何显着提高这样的性能?
解决方案
在查询的两个版本上运行一个显示计划。
可能正在发生的事情是排序强制执行不同的查询计划,该计划对您的特定数据连接策略(可能在内存中)使用更高效,但估计成本更高。
推荐阅读
- javascript - 在一系列游戏搜索中匹配玩家
- excel - 获取列表框值
- sql - SQL 透视单到多列和多行
- amazon-web-services - 按日期查询 Amazon S3 对象
- kubernetes - pod 日志的 K8s 限制
- flutter - 单击类别时刷新菜单项颤动
- java - 超级关键字在我的 java 代码中显示错误
- .htaccess - Htaccess 301 从 en url 重定向到主 url
- include - 添加(附加到 .text 部分)文件内容到 ELF 二进制文件(ld,arm-none-eabi-ld) - INPUT 关键字
- linux - RabbitMQ 无法在 Kubernetes 上启动持久性存储。权限被拒绝错误