
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ランキング
-
棒読みちゃんが起動できないの...
-
子供向けプログラミングのスク...
-
osqleditについて
-
オラクル12C_SQLPlusで実行す...
-
sqlで質問です。 Aテーブルは店...
-
SQLの中上級者へのレベルアップ...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
質問です。 下記のテーブルとデ...
-
Oracleですがsqlで質問です。 ...
-
sqlで質問です。 Aテーブルの登...
-
sqlで質問です。 Aテーブルの情...
-
SQLの書き方について
-
SQLについて教えて下さい。 主...
-
sqlで質問です。 idを元にidに...
-
oracleで 10,20, 30, というデ...
-
索引作成について
-
googleプレイの履歴で取得とイ...
-
sql(oracle)で質問です。 テ...
-
オラクルゴールドについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
likeとsubstrの使いわけについて
-
あいまい検索のパフォーマンス...
-
Oracleで検索すると、フリーズ...
-
ヒント句が無効になります
-
アナライズでほとんどの処理が...
-
実行計画HASH JOIN RIGHT OUTER
-
WHERE句はJOIN結合前結合後どち...
-
Like文の速度について教えてく...
-
統計情報取得
-
Oracleでデータ取得処理を高速...
-
外部結合と等価結合のパフォー...
-
Analyzeとは?
-
OEMで負荷の少ないSQLの実行計...
-
問題解決のストーリーにて PDCA...
-
oracleのanalyzeと処理時間につ...
-
処理速度の改善について
-
800万件のテーブル読み込み...
-
【チューニング】インデックス...
おすすめ情報