【发布时间】:2021-10-16 21:35:00
【问题描述】:
我有一个下面的查询,这导致排序运算符溢出 tempdb 中的数据,并且很可能是导致我面临的性能问题的原因。
SELECT
P_All.Status, P_All.Date, P_All.Year, P_All.Amount, P_All.ID,
P.ID,
A.ID, A.Type_ID, A.Date, A.Amount,
R.Year, R.Amount, R.Balance, R.Title, R.TOTAL, R.TYPE, R.Date, R.ID,
O.TYPE, O.Name, O.CITY,
D.City, D.Code, D.Zip, D.Address,
S.Description,
FROM
Pmnt P INNER JOIN Rqst R ON P.Rqst_ID=R.ID
INNER JOIN Org O ON R.Org_ID=O.ID
INNER JOIN Pmnt P_All ON R.ID=P_All.Rqst_ID
LEFT OUTER JOIN Actvty A ON R.ID=A.Rqst_ID
INNER JOIN Addrs D ON O.Addrs_ID=D.ID
INNER JOIN Sts S ON O.Sts_ID=Sts.ID
WHERE
R.TYPE=N'INITIAL' AND R.Date<{ts '2021-08-13 00:00:00'}
ORDER BY
O.TYPE, R.ID
我尝试了一些我在谷歌上找到的东西,但没有一个能消除这个警告。
到目前为止我尝试过的事情如下:
- 使用
Exec sp_updatestats和UPDATE STATISTICS Org with fullscan更新了统计信息(以上所有6 个表格)。 - 为所有 6 个表创建了涉及此查询中涉及的所有列的索引。 (我对索引很陌生)
谁能帮助我解决这个警告?如果您需要我的其他东西,请随时告诉我。
注意:我在this article 中找到了一种可能的解决方案,将数据库的兼容性级别更新为150,但我担心如果更改它可能会搞砸一些事情。所以,现在我正在寻找一些与索引或查询优化相关的解决方案。
实际的 SQL 查询执行计划 - https://www.brentozar.com/pastetheplan/?id=HJxdkN4et
【问题讨论】:
-
协助调优的第一件事是使用PasteThePlan提供实际的执行计划
-
仅供参考,您真的不需要
FROM中的所有括号;它们实际上使您的 SQL 更难遵循,而不是更容易。 -
@Stu 在帖子中添加了计划链接。
-
@Larnu 是的,很抱歉。这是其他人编写的非常古老的代码。现已更新。
标签: sql sql-server sqlperformance