- - PR -
条件で絞ったテーブル同士でJOINのレスポンスについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2006-07-18 13:27
いつも大変勉強になります。
SQLServer2000 条件で絞ったテーブル同士でJOINのレスポンスについてJOINについてです。 たとえば ・個人テーブル ---キー--- 個人番号 個人SEQ ---------- 期間FROM 期間TO ・情報テーブル ---キー--- 個人番号 個人SEQ ---------- 発生日FROM 有効期限TO というテーブルがあった場合 @----------------------------------------------------------- SELECT * FROM 個人テーブル INNER JOIN 個人情報テーブル ON 個人テーブル.個人番号=情報テーブル.個人番号 AND 個人テーブル.個人SEQ=情報テーブル.個人SEQ ----------------------------------------------------------- とした場合、キー同士で結びつけてあるので速いと思うのですが、 A----------------------------------------------------------- SELECT * FROM (SELECT * FROM 個人テーブル WHERE 期間FROM <= 本日日付 AND 期間TO >= 本日日付) AS 個人テーブル INNER JOIN (SELECT * FROM 情報テーブル WHERE 発生日FROM <= 本日日付 AND 有効期限TO >= 本日日付) AS 情報テーブル ON 個人テーブル.個人番号=情報テーブル.個人番号 AND 個人テーブル.個人SEQ=情報テーブル.個人SEQ ---------------------------------------------------------- というように条件をつけたテーブルを結合した場合は レスポンスは遅いのでしょうか? また、 B----------------------------------------------------------- SELECT * FROM 個人テーブル INNER JOIN 個人情報テーブル ON 個人テーブル.個人番号=情報テーブル.個人番号 AND 個人テーブル.個人SEQ=情報テーブル.個人SEQ WHERE (期間FROM <= 本日日付 AND 期間TO >= 本日日付) AND (発生日FROM <= 本日日付 AND 有効期限TO >= 本日日付) ----------------------------------------------------------- のようにAとは違うように条件を付けた場合、 BよりAのほうが速いのでしょうか? 初歩的な質問かもしれませんが、 よろしくお願い致します。 | ||||
|
投稿日時: 2006-07-18 15:50
クエリアナライザで複数のクエリを実行計画プランつきで実行すると
相対的なコストが見れます。 コスト比較でなく実際の処理時間ならプロファイラで確認すればいいし。 | ||||
|
投稿日時: 2006-07-19 17:06
2と3は同等のクエリですよね? であれば、オプティマイザが十分賢ければ同等のプラン
となるはずですから、両者の違いはほとんどないはずです。ただし2のクエリのほうが 複雑ですから、(わずかでしょうが)コンパイルに時間がかかるでしょうし、間違った プランを吐く可能性もないとはいえません。ですので、クエリは可能な限りシンプルに したほうがいいでしょう。 また、
との記述がありますが、それほど単純なことではありません。もちろん、結合条件に インデックスが貼られているカラムが使われていることは重要(というかそうでない 方が特殊)ですが、絞込みの際にどちらのテーブルから絞込みが行われるか、その際に どのインデックスが使われるか、といったことが重要です。 書かれている条件ですと、選択条件となっているカラムにインデックスが貼られている かどうか、指定した条件でそれぞれどれくらいの選択結果になるか、などの情報が まったくないため、クエリとしてどんなプランになるかはまったく想像できません。 さらにいうとめだかさんが書かれているように、実際にクエリがどのようなプランで 実行されるかを検証する必要があります。想定したプランで実行してくれないことは よくあることですから。 | ||||
1
