【问题标题】:Optimize SQL Server Aggregation Query优化 SQL Server 聚合查询
【发布时间】: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”或“*”,然后对查询进行分组以进行计数。

他们有多少个第一名,多少个第二名,等等......

【问题讨论】:

    标签: sql sql-server query-optimization


    【解决方案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;,并从我的答案中查询。我还看到你没有聚集索引。我对吗?
    猜你喜欢
    • 2020-05-13
    • 2010-12-18
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2010-10-23
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多