优化 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

【讨论】:

比我的原始代码干净多了。好的。你的执行计划要简单得多,因为我的里面充满了嵌套循环、计算标量等。它看起来还是有点慢。我要去看看这个,看看它是如何公平的。如果实时数据过于繁重,我总是可以在晚上汇总数据。 usagnumTeamResult 列上添加索引,并将EventPlace1EventPlace2、...、AAPlace 列添加到索引中。另外,请为您的表指定您的服务器版本和DDL 请告诉我,我只是想知道,为什么您认为查询有点慢。运行查询后你得到多少scan count 我没有看到扫描计数。我有类似的东西,排序成本 32%;嵌套循环成本 1%; RID 查找(堆)成本 58%;索引搜索(非集群)9%。就是这样,正如我所说的非常干净(其他一切都在 0. 在执行您的原始查询之前运行SET STATISTICS IO ON;,并从我的答案中查询。我还看到你没有聚集索引。我对吗?

以上是关于优化 SQL Server 聚合查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server基础优化

sql server都有哪些查询优化方法

SQL Server查询优化方法

SQL -- SQL Server 查询优化器(Query Optimizers)

SQL Server 'OR' 查询优化

优化 SQL Server 查询以提高速度