2013-03-04 7 views
6

私はこのようなクエリを使用している場合:WHEREフィルタリングはいつ行われますか?

SELECT 
    A.ID, 
    A.Name, 
    A.Type, 
    B.FirstName, 
    B.LastName, 
    B.DateOfBirth, 
    C.OfficeName 
FROM A 
    INNER JOIN B ON A.ContactID = B.ID 
    INNER JOIN C ON B.OfficeID = C.ID 
WHERE 
    A.Type = 1 

ときA.Type = 1つのフィルタが適用されますでしょうか?結合後か、またはクエリが 'A'をルックアップしてフィルタを通過するかどうかを判断し、それがあった場合にのみBとCに結合しますか?

希望はこれが理にかなっています。ありがとう。

+1

のために依存しますが、クエリの実行プランを含めることはできますか?それはおそらくあなたの質問に答えるでしょう。 – mellamokb

+1

私はいつも、クエリオプティマイザがそれを理解して、それが最適であった(または近くに)どこに適用したかの印象を受けました。 SSMSで「実際のクエリプランを含める」オプションをオンにしてクエリを実行すると、何が起こるかを確認できます。 –

+0

何か変わるのですか?結果が正しいことはもちろんです。 SQL Serverはより効率的な方法になります。 – MarcinJuraszek

答えて

8

、以下の操作のSQL順序である:FROM句

  • WHERE句
  • HAVING句
  • SELECT句
  • BY句
  • GROUP ORDER BY句

単純なクエリでは、フィルタリングはFROM句(の結合がこの部分に見つかった場合)の後に発生します。)。上記のあなたの気持ちは、主に関係を定義するリンク列とテーブルを結合することです。設定されている記録(ジョインの結果)WHERE句、その後でTypeをフィルタリングするために行われた後

まず、ここでLEFT JOINを使用してのもう一つの例だ1


に等しく、クエリ:2番目のクエリー対

SELECT A.ID, 
     A.Name, 
     A.Type, 
     B.FirstName, 
     B.LastName, 
     B.DateOfBirth 
FROM A 
     LEFT JOIN B 
      ON A.ContactID = B.ID AND 
       B.LastName = 'Michaels' 

SELECT A.ID, 
     A.Name, 
     A.Type, 
     B.FirstName, 
     B.LastName, 
     B.DateOfBirth 
FROM A 
     LEFT JOIN B ON A.ContactID = B.ID 
WHERE B.LastName = 'Michaels' 

最初のクエリは、テーブルAのすべてのレコードを返します。 B.LastName = 'Michaels'は、テーブルBがテーブルAと結合される前に、LastNameMichaelsに等しいすべてのレコードを除外します。したがって、表Bのフィルタリングされたレコードに一致しない表Aのレコードは、表Bの列の値がNULLになります。

2番目のクエリでは、最初のクエリでは同じ結果が得られず、レコードが結合された後に結果として別のフィルタリングが実行され、と等しいレコードしか取得されないため正確にINNER JOINと同じ結果を返します。 マイケルズ

句が前に適用されます
6

論理的には、joinの後、物理的にはオプティマイザになります。

2

これに答えるには、実際に実行計画を調べる必要があります。 where句に検索可能な引数(SARG)がある場合は、結合の前にアクセスメソッド(インデックス、テーブルスキャンなど)を適用する可能性が高くなります。

使用

クエリ]メニュー - > [実際の実行プランを含める

または

クエリ]メニュー - > [推定実行プランの表示

見てみ。

4

MSDN

  • ON
  • FROM SELECT文

    1. 論理的な処理順序をというセクションが
    2. WHERE
    3. GROUP
    4. BY CUBE WITHまたはROLLUP
    5. WITH JOINのチェック
    6. HAVING
    7. TOP

    BY

  • DISTINCT ORDER重要な注意点は、このリストの前の段落の最後にあります]を選択します。

    ステートメントの実際の物理的実行は、クエリプロセッサによって決定され、順序はこのリストと異なる場合があることに注意してください。で開始する

  • 1

    すなわち、それはBとCからAと対応する行のすべての行を返します。参加条件に参加し、タイプ= 1

    関連する問題