SQL性能查询如何聚合相同TextData 求和CPU、Duration等资源指标
实现方案
你需要使用GROUP BY子句按TextData分组,配合聚合函数SUM()计算各指标的总和,参考SQL如下:
方案1:仅按TextData聚合(仅统计SQL语句的整体消耗)
SELECT TOP 40 TextData, SUM(CPU) AS 总CPU, SUM(Duration) AS 总Duration, SUM(Reads) AS 总Reads, SUM(Writes) AS 总Writes, COUNT(*) AS 执行次数 -- 额外增加执行次数字段,方便排查高频执行的SQL FROM dbo.PerformanceTable WHERE Duration > 10000 AND TextData IS NOT NULL -- 过滤掉无SQL文本的记录,按需开启 GROUP BY TextData ORDER BY 总Duration DESC -- 可按需修改排序字段,比如按总CPU、总Reads排序
方案2:按多维度聚合(需要区分不同主机、数据库、应用、登录名的消耗时使用)
如果需要同时保留HostName、DatabaseName等维度的信息,需要把这些非聚合字段全部加入GROUP BY子句:
SELECT TOP 40 HostName, DatabaseName, ApplicationName, LoginName, TextData, SUM(CPU) AS 总CPU, SUM(Duration) AS 总Duration, SUM(Reads) AS 总Reads, SUM(Writes) AS 总Writes, COUNT(*) AS 执行次数 FROM dbo.PerformanceTable WHERE Duration > 10000 AND TextData IS NOT NULL GROUP BY HostName, DatabaseName, ApplicationName, LoginName, TextData ORDER BY 总Duration DESC
补充说明
- 可根据实际排查需求修改
ORDER BY的排序字段,比如要找IO最高的SQL就改成ORDER BY 总Reads DESC - 不需要的维度可以直接从SELECT和GROUP BY中移除
- 不需要TOP 40限制的话,直接去掉
TOP 40关键字即可
内容的提问来源于stack exchange,提问作者dan Kalio
相关产品推荐
相关产品推荐

