
Oracle10gでのSQL文の違いについて教えて下さい。
前回の質問は、ストアドプロシージャに記述
されていて、バッチとして動かしています。
と書きましたが、ビューの場合のパフォーマンスの違いは
どうなるのでしょうか?ビューの場合も同じような現象です。
下記の2つのSQL文は外部結合ありと外部結合なしの違いだけで、
他は変わりありません。
外部結合ありのほうは
結果がすぐに返されるのですが、外部結合なしのほうは
結果が返ってこない、あるいはかなり時間がかかるという
現象が起きています。
SQL文は簡略して記述していますが、SELECT句には、
TO_CHAR()やSUM(CASE WHEN ...THEN ...ELSE...)が使用してあり
少し重くなる処理も含まれています。
この2つのSQL文でパフォーマンスに影響している原因は
何なんでしょうか?オプティマイザとか実行計画とかの
説明を読んだのですが、いまいちよく解りません。。
自分では中級者以下だと思っていますので、わかりやすく
説明して頂けたら助かります。宜しくお願い致します。
(外部結合ありのSQL)
SELECT
a.項目1,
a.項目2,
a.項目3,
a.項目4,
a.項目5
FROM
TBL_A a,
TBL_B b
WHERE
a.項目1 = b.項目1(+) AND
a.項目2 = b.項目2(+) AND
a.項目3 = b.項目3(+) AND
a.項目4 = b.項目4(+) AND
GROUP BY
a.項目1,
a.項目2,
a.項目3,
a.項目4,
a.項目5
(外部結合なしのSQL)
SELECT
a.項目1,
a.項目2,
a.項目3,
a.項目4,
a.項目5
FROM
TBL_A a,
TBL_B b
WHERE
a.項目1 = b.項目1 AND
a.項目2 = b.項目2 AND
a.項目3 = b.項目3 AND
a.項目4 = b.項目4 AND
GROUP BY
a.項目1,
a.項目2,
a.項目3,
a.項目4,
a.項目5
No.1ベストアンサー
- 回答日時:
オラクルのオプティマイザは、テーブルの検索の方法を決めますが、外部結合と内部結合で
立案される実行計画に違いがあり、内部結合の方が合理的な検索方法を立案しているので
結果的に、内部結合の方が速いという話なんですが・・
実行計画を見なければ、判りませんが、
・外部結合はbに対して全表検索を選択した。
・内部結合では、bを索引検索を選択した。
・bの検索量が、bの格納件数のうち、ごく一部なので、全表検索と索引検索では、極端に検索時間が違う。
ということなんだと思います。(推測なので、実は違うかも知れません)
オラクルのマニュアルで、パフォーマンスチューニングガイドというマニュアルがあると思うので、
一読されることをお勧めします。
ちなみに、お書きになったSQLは何か変です。
内部結合のSQLは、bの項目を返さないので、実質的にbに存在するかのチェックを行っているに等しいものです。
書き方や流儀の問題で、内部結合が良いのか、exists条件が良いのか、in条件(メンバーシップ検査)が良いのか
変わってくると思いますが、一応理解できるものです。
しかし、外部結合のSQLについては、bを検索するけど、何もしない??理解に苦しむSQLになっています。
基本的に、内部結合より遅くなる外部結合を、わざわざ書いてみた、というように感じます。
(一般論ですが、同じ書き方をしたら、外部結合は内部結合と同等以下です)
この回答への補足
ご回答ありがとうございます。
>ちなみに、お書きになったSQLは何か変です。
>内部結合のSQLは、bの項目を返さないので、実質的にbに存在する>かのチェックを行っているに等しいものです。
このSQL文は簡略しすぎました、bのテーブルからも項目をSELECTしています、すみませんでした。。
その点を踏まえても同じようなご回答になっていましたでしょうか?
また、ビューでもストアドプロシージャでも同じようなパフォーマンスになるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
likeとsubstrの使いわけについて
-
WHERE句の実行順序
-
あいまい検索のパフォーマンス...
-
WHERE句はJOIN結合前結合後どち...
-
ヒント句が無効になります
-
Oracleで検索すると、フリーズ...
-
SQL ORDER BYにおける条件について
-
Oracleでデータ取得処理を高速...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
SQLで部分的にGROUP BYしたいとき
-
sqlplusでヘッダーが付かない
-
PL/SQLカーソルの2重FORループ...
-
ストアドプロシジャからストア...
-
callで順に実行されるプロシー...
-
日付型カラムへのデータINSERT
-
sqlplusのspoolで空白行出現
-
エクセルVBAでUserFormを起動し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
likeとsubstrの使いわけについて
-
ヒント句が無効になります
-
あいまい検索のパフォーマンス...
-
Like文の速度について教えてく...
-
WHERE句はJOIN結合前結合後どち...
-
いつもお世話になってます。
-
パフォーマンスについて
-
問題解決のストーリーにて PDCA...
-
SQL ORDER BYにおける条件について
-
実行計画HASH JOIN RIGHT OUTER
-
計画力をつけるにはどうすれば...
-
表の結合(性能)
-
JOINの時のONとWHEREの違いにつ...
-
アナライズでほとんどの処理が...
-
実行計画の取得方法について
-
実行計画(EXPLAIN PLAN、AUTOT...
-
外部結合と等価結合のパフォー...
-
アナライズとヒント句
おすすめ情報