トップ回答者
INNER JOINで結合する場合と、WHERE句で結合する場合の違いについて

質問
回答
-
-
コンドルさん、はじめまして。
下記のページの下部から実行プランについての機能説明ビデオを見ることができるようです。
http://www.microsoft.com/japan/sql/prodinfo/previousversions/techinfo/video/Tuning.mspx
こういうのもありました。
http://msdn.microsoft.com/ja-jp/library/cc707363.aspx
クエリの最適化については参考書もありますしBooksOnlineにも詳細に書かれているので結合の違いについて分かるのではないかと思います。
これは私の意見ですが結合するTBLのインデックスの付け方もそうですがデータ量や統計の有無など複数の要素で最適なクエリの書き方は異なるのではないかと思います。
あと、SQL1,2で関数 GETDATE() が使われていましたので関数の使用についてSQL Server2008オンラインブックからの引用ですがご確認ください。
http://msdn.microsoft.com/ja-jp/library/ms190642.aspx
------------------------------------------------------------------------------------------------------------------------------------------------------------
可能な場合は、以下のガイドラインに従うことをお勧めします。
1.選択可能な場合は、厳密に決定的な関数を記述します。特に、Transact-SQL 関数はスキーマ バインドにします。
2.非決定的な関数の使用を選択リストの一番外側に検定します。
3.パフォーマンスが重要なクエリでは、非決定的関数を使用しないでください。
4.呼び出しの数、順序、またはタイミングは実装によって異なるので、これらに依存しないでください。
詳細については、「決定的関数と非決定的関数」を参照してください。
------------------------------------------------------------------------------------------------------------------------------------------------------------
すべての返信
-
-
ご回答ありがとうございます。
実行プランで確認すれば、良いのですね。
勉強になりました。
今の質問に関連して、もうひとつ質問があります。
もしよろしければ、ご教示下さい。以下の2つのSQLをクエリアナライザから実行して、統計を見ました。
SQL1
Code SnippetSELECT
*
FROM
販売テーブル AS H
INNER JOIN
取引先テーブル AS T
ON
H.取引先コード = T.取引先コード
AND GETDATE() BETWEEN T.適用開始日 AND T.適用終了日SQL2
Code SnippetSELECT
*
FROM
販売テーブル AS H
INNER JOIN
取引先テーブル AS T
ON
H.取引先コード = T.取引先コード
WHERE
GETDATE() BETWEEN T.適用開始日 AND T.適用終了日すると以下の3つの項目に関して差異がでました。
Code SnippetSQL1 SQL2
-------------------------------------------------------------------
SELECT ステートメントの数 2 0
SELECT ステートメントで処理された行数 1193 0
ユーザー トランザクション数 5 0
これらの項目のヘルプを確認したのですが、
http://msdn.microsoft.com/ja-jp/library/aa216969(SQL.80).aspx
うまく理解できませんでした。これはSQL1では、結合処理をするたびに条件(適用期間の判断)を見るため、
たくさんのSELECT文が実行されていて、
処理が遅くなると判断してよろしいでしょうか?ご回答よろしくお願い致します。
-
コンドルさん、はじめまして。
下記のページの下部から実行プランについての機能説明ビデオを見ることができるようです。
http://www.microsoft.com/japan/sql/prodinfo/previousversions/techinfo/video/Tuning.mspx
こういうのもありました。
http://msdn.microsoft.com/ja-jp/library/cc707363.aspx
クエリの最適化については参考書もありますしBooksOnlineにも詳細に書かれているので結合の違いについて分かるのではないかと思います。
これは私の意見ですが結合するTBLのインデックスの付け方もそうですがデータ量や統計の有無など複数の要素で最適なクエリの書き方は異なるのではないかと思います。
あと、SQL1,2で関数 GETDATE() が使われていましたので関数の使用についてSQL Server2008オンラインブックからの引用ですがご確認ください。
http://msdn.microsoft.com/ja-jp/library/ms190642.aspx
------------------------------------------------------------------------------------------------------------------------------------------------------------
可能な場合は、以下のガイドラインに従うことをお勧めします。
1.選択可能な場合は、厳密に決定的な関数を記述します。特に、Transact-SQL 関数はスキーマ バインドにします。
2.非決定的な関数の使用を選択リストの一番外側に検定します。
3.パフォーマンスが重要なクエリでは、非決定的関数を使用しないでください。
4.呼び出しの数、順序、またはタイミングは実装によって異なるので、これらに依存しないでください。
詳細については、「決定的関数と非決定的関数」を参照してください。
------------------------------------------------------------------------------------------------------------------------------------------------------------