优化 SQL Server 聚合查询
Posted
技术标签:
【中文标题】优化 SQL Server 聚合查询【英文标题】:Optimize SQL Server Aggregation Query 【发布时间】:2013-09-04 05:50:13 【问题描述】:我正在寻找有关如何优化此查询的想法。我已经评估了执行计划,但它没有为缺少索引提供任何想法,所以只是好奇编写查询是否更好(不同的策略)会导致更快/更轻的查询。
SELECT [Place], COUNT([Place])
FROM (
SELECT scoresid, REPLACE(REPLACE(EventPlace1,'T', ''),'*','') [Place]
FROM [MS.Prod]..mso_scores UNION
SELECT scoresid, REPLACE(REPLACE(EventPlace2,'T', ''),'*','')
FROM [MSO.Prod]..mso_scores UNION
SELECT scoresid, REPLACE(REPLACE(EventPlace3,'T', ''),'*','')
FROM [MSO.Prod]..mso_scores UNION
SELECT scoresid, REPLACE(REPLACE(EventPlace4,'T', ''),'*','')
FROM [MSO.Prod]..mso_scores UNION
SELECT scoresid, REPLACE(REPLACE(EventPlace5,'T', ''),'*','')
FROM [MSO.Prod]..mso_scores UNION
SELECT scoresid, REPLACE(REPLACE(EventPlace6,'T', ''),'*','')
FROM [MSO.Prod]..mso_scores UNION
SELECT scoresid, REPLACE(REPLACE(AAPlace,'T', ''),'*','')
FROM [MSO.Prod]..mso_scores
) data1
JOIN [MSO.Prod]..mso_scores scores ON scores.scoresid = data1.scoresid
AND scores.usagnum = '274246'
AND scores.TeamResult='N'
WHERE data1.Place IN ('1', '2', '3')
GROUP BY Place
简单解释一下:有 6 个活动地点字段。这些字段中的数据看起来像“1”、“2”、“1T”、“3”、“5T”;其中“T”是平局。我只关心数字 1、2、3,所以我从该位置解析出“T”或“*”,然后对查询进行分组以进行计数。
他们有多少个第一名,多少个第二名,等等......
【问题讨论】:
【参考方案1】:试试这个(2008 年及更高版本)-
SELECT [Place], COUNT(1)
FROM (
SELECT [Place] = REPLACE(REPLACE(t.[Place], 'T', ''), '*', '')
FROM dbo.mso_scores r
OUTER APPLY (
VALUES
(EventPlace1),
(EventPlace2),
(EventPlace3),
(EventPlace4),
(EventPlace5),
(EventPlace6),
(AAPlace)
) t([Place])
WHERE r.usagnum = '274246'
AND r.TeamResult = 'N'
) d
WHERE d.Place IN ('1', '2', '3')
GROUP BY d.Place
有关更多信息,请阅读此主题:Tips for SQL Query Optimization by Analyzing Query Plan
【讨论】:
比我的原始代码干净多了。好的。你的执行计划要简单得多,因为我的里面充满了嵌套循环、计算标量等。它看起来还是有点慢。我要去看看这个,看看它是如何公平的。如果实时数据过于繁重,我总是可以在晚上汇总数据。 在usagnum
、TeamResult
列上添加索引,并将EventPlace1
、EventPlace2
、...、AAPlace
列添加到索引中。另外,请为您的表指定您的服务器版本和DDL
。
请告诉我,我只是想知道,为什么您认为查询有点慢。运行查询后你得到多少scan count
?
我没有看到扫描计数。我有类似的东西,排序成本 32%;嵌套循环成本 1%; RID 查找(堆)成本 58%;索引搜索(非集群)9%。就是这样,正如我所说的非常干净(其他一切都在 0.
在执行您的原始查询之前运行SET STATISTICS IO ON;
,并从我的答案中查询。我还看到你没有聚集索引。我对吗?以上是关于优化 SQL Server 聚合查询的主要内容,如果未能解决你的问题,请参考以下文章