- PR -

WHERE句の中について

1
投稿者投稿内容
新人
会議室デビュー日: 2005/01/06
投稿数: 2
投稿日時: 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'変数を使用

実行時間(コスト)は変わってくるのでしょうか?
よろしくお願いします。
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2005-01-11 15:42
引用:

DB2を使用しております。
複数のテーブルを使ってデータを取得したいです。
3つのテーブルを考えてWHERE句で絞込みを行います。

SELECT *
FROM T1,T2,T3
WHERE T1.cd = 'AAA' ←'AAA'変数
AND T2.cd = T1.cd
AND T3.cd = T2.cd



# DB2 はよく知らないのですが

上記の書き方だと、

- T1 の cd 列と T2 の cd 列の値で結合
- T2 の cd 列と T3 の cd 列の値で結合
- そのうち、T1 の cd 列の値が 'AAA' の行

という解釈になると思いますが(T2 の両端に T1 と T3 が
くっついたようなイメージ)、

引用:

このとき、WHERE句書き方を変えると、

例1)
WHERE T1.cd = 'AAA'
AND T2.cd = T1.cd
AND T3.cd = T1.cd ←T1.cdを使用



の場合は

- T1 の cd 列と T2 の cd 列の値で結合
- T1 の cd 列と T3 の cd 列の値で結合
- そのうち、T1 の cd 列の値が 'AAA' の行

ということで T1 の両端に T2 と T3 がくっつくような
イメージになるかと。データ量によってはアクセスパスが
変わることはありえるのでは。

しかし、

引用:

例2)
WHERE T1.cd = 'AAA'
AND T2.cd = 'AAA'
AND T3.cd = 'AAA' ←'AAA'変数を使用

実行時間(コスト)は変わってくるのでしょうか?



は表を結合させているわけではないので、単に
T1, T2, T3 を直積演算した上で、各列の値が 'AAA' の
行を取ってくるようなイメージになるかと。
そもそも SQL の意味合いが異なるので、へたしたら
実行結果も違ってくるかもしれないですね。
ishi
会議室デビュー日: 2004/07/16
投稿数: 17
投稿日時: 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/06
投稿数: 2
投稿日時: 2005-01-12 18:58
もしもしさん、ishiさん、ご返答いただきありがとうございます。
大変勉強になりました。
1

スキルアップ/キャリアアップ(JOB@IT)