2

私は最近、この部分を持つストアドプロシージャを作成しました

select T.Id from Teams T
inner join 
(
    select SG.Team1Id, SG.Team2Id from SG
    union all
    select SP.Team1Id, SP.Team2Id from SP
) G
on T.Id in (G.Team1Id, G.Team2Id)

このクエリの効率については疑問です

SGこのクエリは、サブクエリから、およびサブクエリ内のすべてのレコードを取得し、SP結合条件を適用しますか? はいの場合、これは効率的ではないと思います

また

SQLサーバーは、結合の基準に一致する両方のテーブルから行のみをフェッチするのに十分スマートですか?

4

1 に答える 1

2

派生テーブルのは、次の代替定式化よりも効率的である可能UNION ALL性があります

SELECT T.Id
FROM   Teams T
       INNER JOIN SG
         ON T.Id IN ( SG.Team1Id, SG.Team2Id )
UNION ALL
SELECT T.Id
FROM   Teams T
       INNER JOIN SP
         ON T.Id IN ( SP.Team1Id, SP.Team2Id ) 

あなたの質問のバージョンは 1 つのパススルーしか必要としないためTeamsです。テーブルSPに同じにすることができないSGなどの制約があり、個々の列にインデックスが付けられている場合、次のほうがパフォーマンスが向上する可能性があります (一部のデータ分散では、特に関係する他のテーブルと比較して比較的大きい場合)Team1IdTeam2IdTeams

SELECT T.Id
FROM   Teams T
       INNER JOIN (SELECT SG.Team1Id
                   FROM   SG
                   UNION ALL
                   SELECT SG.Team2Id
                   FROM   SG
                   UNION ALL
                   SELECT SP.Team1Id
                   FROM   SP
                   UNION ALL
                   SELECT SP.Team2Id
                   FROM   SP) G(TeamId)
         ON T.Id = G.TeamId 
于 2013-04-21T19:42:58.680 に答える