1

SP内Codeで、2番目のアカウントのクライアントのいずれかと一致する最初のアカウントのいくつかのクライアントのIDを見つける必要があります。動作する次のクエリを作成しました-

    SELECT DISTINCT cil.Id FROM ClientIdList AS cil
    INNER JOIN Client AS c1
    ON cil.Id = c1.Id
    INNER JOIN Client AS c2
    ON c1.Code = c2.Code
    WHERE c2.AccountId = 2
    ORDER BY cil.Id  

ClientIdListこれは、最初のアカウントから選択されたクライアントの ID を保持する単一列のテーブル型変数です (そして、この時点より前に他の要件のためにこの変数を使用する必要があります) 。WHERE次のように条件を条件として句に入れると、同じ正しい出力を得ることができJOINます-

    SELECT DISTINCT cil.Id FROM ClientIdList AS cil
    INNER JOIN Client AS c1
    ON cil.Id = c1.Id
    INNER JOIN Client AS c2
    ON c1.Code = c2.Code AND c2.AccountId = 2
    ORDER BY cil.Id  

2000 のアカウントとアカウントあたり 10000 のクライアント (つまり、Clientテーブルの 2000 x 10000 行) を考慮すると、どれが適切な選択でしょうか?

クエリをさらに最適化してパフォーマンスを向上させることはできますか?

編集:実際には、条件はSPへのパラメータc2.AccountId = @accountIdです@accountId

編集2:私が理解している限り、WHERE句のバージョンでは、クライアントテーブルの残りの部分でJOINが実行され結果はWHERE条件に基づいてフィルタリングされます。ただし、新しいバージョンでは、条件が満たされるより小さな行セットで JOIN を実行する必要があります。私は正しいですか?もしそうなら、新しいバージョンはより良いパフォーマンスを提供するべきではありませんか?

4

3 に答える 3

1

いくつかの理由で、新しいJOIN構文を使用します。

  • コードはより読みやすくなっています。
  • クエリの意図をより適切に記述し、より効率的/より優れた最適化を可能にします。
  • これらの句のセマンティクスが異なるOUTERJOINSで問題が発生することはありません。
于 2013-03-03T00:16:46.077 に答える
1

いずれにせよ、db エンジンは同じ実行計画で終了し、このクエリの記述を改善する方法はありません (ここではインデックスについては説明しません)。

ベスト プラクティスに関しては、定数c2.AccountId = 2WHEREため、 を入れます (これはクエリの選択を変更するために誰かが編集する可能性があるものですが、結合は動作に関連するものであり、この種の変更の対象にはなりません)。 .

しかし、私は通常両方の文章を見て、それを入れてJOINもそれほどショックを受けません:-)

于 2013-03-03T00:10:58.613 に答える
0

どちらのクエリでも同じパフォーマンスが得られます。クエリを最適化して、2番目のJOINを削除できます

SELECT DISTINCT cil.Id 
FROM ClientIdList AS cil JOIN Client AS c ON cil.Id = c.Id                          
WHERE c.AccountId = 2
ORDER BY cil.Id 
于 2013-03-03T01:33:14.590 に答える