优化SQL Server聚合查询

3

我正在寻求如何优化此查询的想法。虽然我已经评估了执行计划,但它并没有提供任何遗漏索引的想法,所以我很好奇是否编写更好的查询(采用不同策略)会导致更快/更轻的查询。

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个回答

3
尝试使用此方法(适用于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

有关更多信息,请参阅此主题:通过分析查询计划进行SQL查询优化的技巧


比起我的原始代码,这个干净多了。不错。你的执行计划要简单得多,而我的则充斥着嵌套循环、计算标量等。但它似乎还是有点慢。我会继续观察它的表现。如果它对实时数据来说太重了,我总可以在晚上聚合数据。 - kstubs
2
usagnumTeamResult 列上添加索引,并将 EventPlace1EventPlace2、...、AAPlace 列作为包含在索引中。请同时指定您的服务器版本和表的 DDL - Devart
请告诉我,我只是想知道,为什么您认为这个查询有点慢。运行查询后,您得到了多少个“扫描计数”? - Devart
我看不到扫描计数。我有排序成本32%;嵌套循环成本1%; RID查找(堆)成本58%;索引查找(非聚集)9%。就是这样,非常干净(其他所有内容都为0)。 - kstubs
1
在执行你的原始查询和我的答案查询之前运行 SET STATISTICS IO ON;。我还注意到你没有聚集索引。是这样吗? - Devart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接