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 位がいくつあるか、2 位がいくつあるかなど..

4

1 に答える 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 クエリの最適化のヒント

于 2013-09-04T05:56:06.097 に答える