- PR -

SQLの結果が返ってこない・・・

1
投稿者投稿内容
つんきち
会議室デビュー日: 2004/03/19
投稿数: 15
投稿日時: 2005-09-06 16:38
初心者つんきちです。

困った現象が起きていて困っています。
下記環境上に、スキーマを2つ用意しています。(各々をスキーマをスキーマ1、スキーマ2とする)(各々違う表領域を使用しています。)
スキーマ1の表領域 A 使用率10%程度
スキーマ2の表領域 B 使用率20%程度
TEMP領域 100%

下記SQLを実行してみたところ、
スキーマ1の方では、
サンプル1、サンプル2どちらで実行しても2秒ぐらいで結果が返ってきます。
しかし、スキーマ2では、
サンプル2は、2秒ぐらいで結果が返ってくるが、
サンプル1の組み方だと30分待っても結果が返ってきません。
テーブルがロックしている訳でもなく、件数もそれほど多くありません。
なお、スキーマ1でサンプル1とサンプル2の実行計画をとりましたが、
それほど大差はありませんでした。
情報が少ないかもしれませんが、この現象に心当たりのある方は、
ご教授お願いします。

####実行するSQLサンプル#######
 サンプル1(Aがメインテーブル)
select * from A, B, C
where
A.キー1 = {検索条件}
and B.キー1 = A.外部キー
and C.キー1 = A.外部キー;

 サンプル2(Aがメインテーブル)
select * from A, B, C
where
A.キー1 = {検索条件}
and B.キー1 = A.外部キー
and C.キー1 = B.キー1;

(環境)
 OS LINUX(RedHad 9.0)
DB Oracle9i
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-09-06 17:09
質問です。

サンプル1のSQLにORDEREDヒントをつけたらどうなりますか?

#1と2を間違えたので修正(^^;

[ メッセージ編集済み 編集者: 夏椰(かや) 編集日時 2005-09-06 17:10 ]
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-09-06 17:17
引用:

つんきちさんの書き込み (2005-09-06 16:38) より:
 サンプル1(Aがメインテーブル)
select * from A, B, C
where
A.キー1 = {検索条件}
and B.キー1 = A.外部キー
and C.キー1 = A.外部キー;




先ほどの書き込みのフォローを自分でしてみる。

サンプル1はBとCの結合が直積では?と思ったので、
ORDEREDヒントをつけて、Aテーブルから結合するようにしたら
早くなるのかどうか気になったのです。
つんきち
会議室デビュー日: 2004/03/19
投稿数: 15
投稿日時: 2005-09-06 18:03
返信ありがとうございます。
つんきちです。

スキーマ2で、ORDEREDをつけて実行してみた所、
サンプル1でもサンプル2でも2秒くらいで実行できました。

スキーマによって、結合順序が変わってしまうというのは、
はじめて知りました。
スキーマ作成時に、何か結合順序の設定があるのでしょうか?
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-09-06 18:09
引用:

つんきちさんの書き込み (2005-09-06 18:03) より:
スキーマによって、結合順序が変わってしまうというのは、
はじめて知りました。
スキーマ作成時に、何か結合順序の設定があるのでしょうか?


物が見れないので推測の域を出ませんが、
スキーマの作成時に決まったのではなく、
テーブルの統計情報などの状態によってオプティマイザがどう判断したかよるかと・・・。

よってスキーマがって言うよりもスキーマに存在する
それぞれのテーブルによって結合順序が変わったかもしれません。

他の可能性としては・・・直積なんでデータ件数も絡んでいるかもしれませんが。
つんきち
会議室デビュー日: 2004/03/19
投稿数: 15
投稿日時: 2005-09-06 18:23
返信ありがとうございます。
つんきちです。

ありがとうございます。
analyzeコマンドでテーブルの統計情報を更新してみます。
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2005-09-06 18:40
引用:

つんきちさんの書き込み (2005-09-06 18:03) より:
スキーマによって、結合順序が変わってしまうというのは、
はじめて知りました。
スキーマ作成時に、何か結合順序の設定があるのでしょうか?



スキーマによってというのは全く関係ないでしょう。
すでに確認済みかと思いますが、CBO が実行計画を立てていれば、
どっちを先に結合するか、とかどっちの表を駆動表にして
結合するか、とかの判断は表のサイズとか内容とかの統計を
元にして立案します。

ところで、表を作成してから今までに統計を取ったことってありましたか?
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-09-06 18:47
where句に
rownum <=10000
を付けて一度実行してみたらどうでしょう?




OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp/
1

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