Sqlのパフォーマンスについての質問です。

さまよい
2014-08-27 11:34 1697 1
Sqlのパフォーマンスについての質問です。
SqlServerにおいて、テーブルを結合する際に、
①結合条件としてデータを絞り込む条件を追加
SELECT *
FROM テーブルA
LEFT JOIN テーブルB 
ON テーブルA.ID = テーブルB.ID
AND テーブルB.ID = '100'

②結合した結果、WHERE句で条件を指定する
SELECT *
FROM テーブルA
LEFT JOIN テーブルB 
ON テーブルA.ID = テーブルB.ID
WHERE
テーブルB.ID = '100'

上記二つのやり方のどちらがパフォーマンスがいいのでしょうか?
ご存知の方がいらっしゃったらご教授願います。

コメント

2014年 09月 02日 (11:53)
こんにちは。
イノ(inno)です。

①番と②番のSQLは結果が異なります。
下記のSQLでご確認ください。


-- #### テストテーブル作成
CREATE TABLE #Table1
(
Idx int
)

CREATE TABLE #Table2
(
Idx int
)

-- #### テストデータ登録
INSERT INTO #Table1
SELECT 100 UNION
SELECT 200 UNION
SELECT 300

INSERT INTO #Table2
SELECT 200


-- #### LEFT OUTER JOIN 実行
SELECT *
FROM #Table1 A
LEFT OUTER JOIN #Table2 B
ON A.Idx = B.Idx AND B.Idx = 200

実行結果
Idx Idx
----------- -----------
100 NULL
200 200
300 NULL

SELECT *
FROM #Table1 A
LEFT OUTER JOIN #Table2 B
ON A.Idx = B.Idx
WHERE B.Idx = 200

実行結果
Idx Idx
----------- -----------
200 200


同じ結果が出るのはLEFT OUTER JOIN ではなく JOIN を利用した時は同じ結果がでます。
ですが、下記のようなSQLだっとどちも同じパフォーマンスです。
少し複雑なSQLになると少し分かるかも知れませんが、
あまり変わらないと思います。

SELECT *
FROM #Table1 A
JOIN #Table2 B
ON A.Idx = B.Idx AND B.Idx = 200


SELECT *
FROM #Table1 A
JOIN #Table2 B
ON A.Idx = B.Idx
WHERE B.Idx = 200