我有一个查询,它首先在内部执行联接cte
,然后基于 cte 与其他表联接,并通过一些聚合执行 group by 并获取前 15 条记录。
此查询在 Azure SQL 数据库上运行需要 23 小时。
细节:
Azure 数据库定价层:S6,具有 750GB 存储空间,剩余 20% 未使用存储空间
TableName rows TotalSpaceGB UsedSpaceGB UnusedSpaceGB
table2 332,318,173 117.72 117.71 0.01
table3 153,700,352 60.78 60.76 0.01
table1 15,339,815 13.21 13.20 0.01
abctable 1,232,868 0.81 0.80 0.00
带查询的实际执行计划
未使用查询的实际执行计划sp_WhoIsActive
等待类型:(14ms)PAGEIOLATCH_SH:dev-db:1(*)
或NULL
有时。得到这个使用sp_WhoIsActive
.
笔记:
实际执行计划是从正在运行的查询中获取的,如此答案所示
该表包含主键上的聚集索引和其他字段上的非聚集索引,我没有在过滤器、联接或排序依据中使用这些索引。
table1
是 的父级table2
并且table2
是 的父级table3
任何意见或建议都非常值得赞赏。
“该表包含主键上的聚集索引和其他字段上的非聚集索引,我没有在过滤器、连接或排序依据中使用这些索引。” -> 如果您的索引不适合查询并且表这么大(您的查询扫描整个表),您就不能指望查询能够快速运行。
如果我是你,我会考虑到这一点:
WHERE pl.issuingdate > '2021-8-1'
CTE(如果您每次都使用此条件并且存在大量早于 2021 年 8 月 1 日的数据,则您的 CTE 可能会变得更小)table1
,我将按以下顺序创建一个包含列的索引:CREATE INDEX ix_01 ON dbo.table1(pluigid, pmode, pltype ,plstatus)
- 它包含您的外键和 WHERE 子句列请尝试创建适合您的查询的索引,尝试重新运行查询,并让我们知道这是否至少能让您朝着正确的方向前进。
另外,除了执行计划之外,我建议运行查询并将
SET STATISTICS TIME, IO ON
SSMS 中“消息”选项卡的结果粘贴到IO 统计解析器,以查看查询在 IO 方面执行的操作。了解 IO 模式将使调优工作更加有效。