もっと効率的な書き方がありますか?これを実装する最良の方法であるかどうかはわかりません。または条件との結合
select *
from stat.UniqueTeams uTeam
Left Join stat.Matches match
on match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id
もっと効率的な書き方がありますか?これを実装する最良の方法であるかどうかはわかりません。または条件との結合
select *
from stat.UniqueTeams uTeam
Left Join stat.Matches match
on match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id
や結合でMSSQLはritgh方法でインデックスを使用することはできませんbecase、悪い習慣です。 より良い方法 - UNIONを持つ2つの選択を使用します。LEFTを使用している間に注意する
SELECT *
FROM stat.UniqueTeams uTeam
LEFT JOIN stat.Matches match
ON match.AwayTeam = uTeam.Id
UNION
SELECT *
FROM stat.UniqueTeams uTeam
LEFT JOIN stat.Matches match
ON match.HomeTeam = uTeam.id
物事は、クエリに参加:すべての
1)まず、参加残すことができNULL(複数可)を導入することができますNULLはサーバーエンジンによって別々に処理されるため、パフォーマンス上の問題が発生します。
2)ヌル可能なテーブルは大量にしてはいけません。それ以外の場合は、実行するにはコストがかかります(パフォーマンス+リソース)。
3)すでに索引付けされている列を含めるようにしてください。そうでなければ、最初により良い列を含める必要がある場合は、それらの列のインデックスを作成します。
あなたのケースでは、同じテーブルの2つの列が別のテーブルに結合されたままになります。私は以下が示されているよう必要なデータの同じ列を持つ単一のテーブルを持つことができるのであれば、この場合には良い方法は次のようになります。
; WITH Match AS
(
-- Select all required columns and alise the key column(s) as shown below
SELECT match1.*, match1.AwayTeam AS TeamId FROM stat.Matches match1
UNION
SELECT match2.*, match2.HomeTeam AS TeamId FROM stat.Matches match2
)
SELECT
*
FROM
stat.UniqueTeams uTeam
OUTER APPLY Match WHERE Match.TeamId = uTeam.Id
私がOUTERを使用していたJOINをLEFT OUTERとほぼ類似している適用されますが、クエリの実行中は異なります。これは、あなたのケースでよりよく実行できるテーブル値関数として機能します。
クエリで 'EXPLAIN'を実行して、実際にSQL Serverが実行していることを確認しましたか?私は、単一の 'OR'条件でインデックスを使うことは可能だと思います。 –
あなたは背中にパットが必要です。ああ、申し訳ありませんが、私が意味する... あなたは背中にupvoteに値する – toha
uTeam.Id IN(match.AwayTeam、match.HomeTeam) –