- - PR -
WHERE句の中について
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-01-06 18:55
お世話になります。
DB2を使用しております。 複数のテーブルを使ってデータを取得したいです。 3つのテーブルを考えてWHERE句で絞込みを行います。 SELECT * FROM T1,T2,T3 WHERE T1.cd = 'AAA' ←'AAA'変数 AND T2.cd = T1.cd AND T3.cd = T2.cd このとき、WHERE句書き方を変えると、 例1) WHERE T1.cd = 'AAA' AND T2.cd = T1.cd AND T3.cd = T1.cd ←T1.cdを使用 例2) WHERE T1.cd = 'AAA' AND T2.cd = 'AAA' AND T3.cd = 'AAA' ←'AAA'変数を使用 実行時間(コスト)は変わってくるのでしょうか? よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-01-11 15:42
# DB2 はよく知らないのですが 上記の書き方だと、 - T1 の cd 列と T2 の cd 列の値で結合 - T2 の cd 列と T3 の cd 列の値で結合 - そのうち、T1 の cd 列の値が 'AAA' の行 という解釈になると思いますが(T2 の両端に T1 と T3 が くっついたようなイメージ)、
の場合は - T1 の cd 列と T2 の cd 列の値で結合 - T1 の cd 列と T3 の cd 列の値で結合 - そのうち、T1 の cd 列の値が 'AAA' の行 ということで T1 の両端に T2 と T3 がくっつくような イメージになるかと。データ量によってはアクセスパスが 変わることはありえるのでは。 しかし、
は表を結合させているわけではないので、単に T1, T2, T3 を直積演算した上で、各列の値が 'AAA' の 行を取ってくるようなイメージになるかと。 そもそも SQL の意味合いが異なるので、へたしたら 実行結果も違ってくるかもしれないですね。 | ||||||||||||
|
投稿日時: 2005-01-12 18:28
sampleデータベースのstaff表を使ってテストをしてみたところ、コストは同じでした。(DB2V8FP2onWindowsXP、オプティマイズレベル:5)
また、db2exfmtの出力の一部であるOptimized Statementは両パターンで同じになりました。(optimize後はWHERE T1.cd = 'AAA' AND T2.cd = 'AAA' AND T3.cd = 'AAA' の形となる。) (テスト内容) db2sampl db2 connect to sample db2 -tvf "C:\Program Files\IBM\SQLLIB\MISC\EXPLAIN.DDL" db2 create table staff2 like staff db2 create table staff3 like staff db2 insert into staff2 select * from staff db2 insert into staff3 select * from staff db2 explain all with snapshot for select * from staff,staff2,staff3 where staff.id=10 and staff2.id = staff.id and staff3.id = staff2.id db2exfmt -d sample -t -1 > tmp1.txt db2 explain all with snapshot for select * from staff,staff2,staff3 where staff.id=10 and staff2.id=10 and staff3.id=10 db2exfmt -d sample -t -1 > tmp2.txt ⇒tmp1.txtとtmp2.txtの内容を確認、比較する。 ご参考まで。 | ||||||||||||
|
投稿日時: 2005-01-12 18:58
もしもしさん、ishiさん、ご返答いただきありがとうございます。
大変勉強になりました。 | ||||||||||||
1
