SQLの実行計画について教えていただきたいです。
【現状】
9iと10gそれぞれの環境で /*+ ALL_ROWS */ を使用したあるSQLの
実行計画を出したところ、全く異なった実行計画になっていました。
コストは9iが2000、10gが150で、10gでは数秒で結果が返ってくるのに対し、
9iではいつまで経っても結果が返ってきません。
9i環境と10g環境とではテーブルの構造やINDEXは同じですが
データの中身は別で、件数は9iが100万件、10gが150万件です。
【教えていただきたいこと】
このように9iと10gとで実行計画や処理の時間が異なる原因は
データの中身が違うこと以外では何が考えられるでしょうか。
解決策があれば合わせてお教えいただきたいです。
/*+ ALL_ROWS */を使えば9iでもSQLをコストベースにできると
思っているのですが、それが間違いなのでしょうか。。。
そもそも実行計画がよく分かっていないので申し訳ないのですが、
何かお気づきのことがあればお教えいただきたいと思います。
よろしくお願いします!
No.5ベストアンサー
- 回答日時:
見やすいように、1バイト空白2個を2バイト空白に変換しました。
【9i】
SELECT STATEMENT REMOTE Cost = 2933
SORT UNIQUE
FILTER
NESTED LOOPS
NESTED LOOPS
HASH JOIN
TABLE ACCESS FULL テーブルA
INDEX FAST FULL SCAN PK_テーブルB UNIQUE
TABLE ACCESS FULL テーブルA ← 問題はここ
INDEX UNIQUE SCAN PK_テーブルB UNIQUE
INDEX UNIQUE SCAN PK_テーブルB UNIQUE
【10g】
SELECT STATEMENT REMOTE Cost = 180
SORT UNIQUE
TABLE ACCESS BY INDEX ROWID テーブルA TABLE
NESTED LOOPS
NESTED LOOPS
NESTED LOOPS ANTI
HASH JOIN
TABLE ACCESS FULL テーブルA TABLE
INDEX FULL SCAN PK_テーブルB INDEX (UNIQUE)
INDEX UNIQUE SCAN PK_テーブルB INDEX (UNIQUE)
INDEX RANGE SCAN PK_テーブルB INDEX (UNIQUE)
INDEX RANGE SCAN テーブルA_IDX01 INDEX
NESTED LOOP JOINの中にテーブルAのFULL SCANが入っています。
これではコストが高くなって当然です。(テーブルAがかなり小さいなら別ですが)
疑問なのは10gで該当する部分が「INDEX UNIQUE SCAN PK_テーブルB INDEX (UNIQUE)」になっていてテーブル名も違います。
失礼ですがコピーする際にミスはありませんでしたでしょうか。
解決の方向としては、実行計画の「TABLE ACCESS FULL テーブルA」を「INDEX SCAN」に変えることです。
これ以上は実際のSQLと作成されているINDEXの情報がないと困難です。
情報の補足をお願いします。
ご回答ありがとうございます。
そして、お礼が遅くなり大変失礼いたしました。
結果から申し上げますと、ご回答を受けて色々と修正を
試みたのですが、結局コストの改善はできませんでした。。。
また、スクリプトについてなのですが、少々ロジックを変えて
PL/SQLで作成してみたところ9iでも結果が取得できました。
作成期日が迫っていたスクリプトだったため、今回については
PL/SQLで対応することにいたしました。
せっかくご回答いただいたのに活かしきれずすみません。
それと、このSQLは仕事に関わるものなためこれ以上情報を
提供することはできそうにありません。。。
中途半端な状態で終わらせてしまい本当に申し訳ないのですが、
本件についてはこれでひと段落とさせていただきたいと思います。
丁寧にご対応くださったnora1962さんをBAに選ばせていただきます。
ご対応いただきありがとうございました。
No.4
- 回答日時:
こんにちわ。
> 9i環境と10g環境とではテーブルの構造やINDEXは同じですが
> データの中身は別で、件数は9iが100万件、10gが150万件です。
例え実行計画が同じでもデータが異なるのであれば性能に大きな
違いがあるのは普通です。
9i 環境で統計情報の再取得を行うと、実行計画が変化して性能が
向上する可能性があります。
ご回答ありがとうございます。
>例え実行計画が同じでもデータが異なるのであれば性能に大きな
>違いがあるのは普通です。
やっぱりそうですよね。。。
>9i 環境で統計情報の再取得を行うと、実行計画が変化して性能が
>向上する可能性があります。
これについては、9iでは統計情報の再取得を行った結果
更にコストがかかるようになってしまいました。。。
No.3
- 回答日時:
9iと10gの実行計画出せますか。
(Explainなどでの)ヒント句を用いて、実行計画を変更できる可能性はあります。
ご回答ありがとうございます。
>9iと10gの実行計画出せますか。(Explainなどでの)
テーブル名の部分だけ変更させていただきましたが、
それぞれ以下のような実行計画になっています。
(統計情報を取得し直したらコストが変わっていました)
【9i】
SELECT STATEMENT REMOTE Cost = 2933
SORT UNIQUE
FILTER
NESTED LOOPS
NESTED LOOPS
HASH JOIN
TABLE ACCESS FULL テーブルA
INDEX FAST FULL SCAN PK_テーブルB UNIQUE
TABLE ACCESS FULL テーブルA
INDEX UNIQUE SCAN PK_テーブルB UNIQUE
INDEX UNIQUE SCAN PK_テーブルB UNIQUE
【10g】
SELECT STATEMENT REMOTE Cost = 180
SORT UNIQUE
TABLE ACCESS BY INDEX ROWID テーブルA TABLE
NESTED LOOPS
NESTED LOOPS
NESTED LOOPS ANTI
HASH JOIN
TABLE ACCESS FULL テーブルA TABLE
INDEX FULL SCAN PK_テーブルB INDEX (UNIQUE)
INDEX UNIQUE SCAN PK_テーブルB INDEX (UNIQUE)
INDEX RANGE SCAN PK_テーブルB INDEX (UNIQUE)
INDEX RANGE SCAN テーブルA_IDX01 INDEX
自分なりに分析・改良をしようとはしているのですが、
まだ勉強不足なため上手くいっていません。
何かアドバイスなどいただけると嬉しいです。
No.2
- 回答日時:
当たり前の話ですが
バージョンアップに伴いオプティマイザの改良も行われています。
同じコストベースとは言え、その結果が全く違うことは多々あります。
(PSRでも変更される場合があります。。。)
ご回答ありがとうございます。
>同じコストベースとは言え、その結果が全く違うことは多々あります。
そうだったんですね。。。
質問してばかりで申し訳ないのですが、『この実行計画で』
と実行計画を指定して実行させる方法はないのでしょうか。
SQL自体の改良も試みてはいるのですが、このままだと
9iの環境では結果が取得できそうにないので。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ルーター・ネットワーク機器 AU光10G回線について 6 2022/07/25 00:12
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- ダイエット・食事制限 【ダイエット】 体脂肪を減らしたいのですが、 朝:鶏胸肉100g、オリーブオイル10g、ヨーグルト2 4 2023/03/31 15:15
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- ルーター・ネットワーク機器 家庭内LANで10GbE 3 2022/11/14 02:03
- 統計学 どの統計を使えばいいのか教えてください(EZ-Rを使用) 5 2022/10/11 13:28
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- その他(自然科学) 計算頼んます 5 2023/08/01 23:19
- その他(ニュース・社会制度・災害) 処理水を薄めて放出する理由はなんですか。 砂糖10gを90gの水に溶かせば、濃度は10%ですよね。同 14 2023/08/25 16:16
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
truncate tableを使って複数の...
-
オラクルのUPDATEで複数テーブル
-
エラーを起こす方法
-
CASEでBETWEEN制約
-
Oracleのシーケンスありのテー...
-
[materialized]マテリアライズ...
-
accessのデータをoracleへinser...
-
ora-01722のエラーについて
-
SELECT実行結果のレスポンス改...
-
OWNER名を指定せずにテーブルを...
-
AccessからOracle DB(View)を...
-
複数レコードの複数フィールド...
-
既にテーブルが存在する場合の...
-
テーブルに変更があったらCSV出力
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
Accessで今日から5日後
-
フラグをたてるってどういうこ...
-
テーブル名が可変の場合のクエ...
-
結合したテーブルをSUMしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
既にテーブルが存在する場合の...
-
データ削除とSQL*Loaderでのイ...
-
複数レコードの複数フィールド...
-
テーブル定義書(Oracle) 【IX】...
-
Where句のNot条件をAnd条件にし...
-
テーブルに変更があったらCSV出力
-
CASEでBETWEEN制約
-
AccessからOracle DB(View)を...
-
[materialized]マテリアライズ...
-
Oracleのリンクテーブルの「精...
-
テーブルDROPできないのです。。。
-
ora-01722のエラーについて
-
pro*cobol ⇔ oracle のデータ型...
-
accessのデータをoracleへinser...
-
フィールド数が異なるテーブル...
-
AccessVBAにて動的にテーブルを...
-
viewの性能
おすすめ情報