質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

実行計画の結果を見ても用語の意味からわかりません。。。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 20K+

GiveAHand

score 276

ORACLEで、動作の遅いSQLがあり、原因究明のため、A5で実行計画を表示させたのですが、用語の意味からわかりません。

UPDATE STATEMENT Cost = 142
 +-UPDATE      TEST001
    +-FILTER
    |  +-TABLE ACCESS   FULL  TEST001
    |  +-NESTED LOOPS
    |     +-NESTED LOOPS
    |     |  +-NESTED LOOPS
    |     |  |  +-TABLE ACCESS   FULL  TEST001
    |     |  |  +-TABLE ACCESS   BY INDEX ROWID  TEST001
    |     |  |     +-INDEX   RANGE SCAN  TEST001.SET_PK
    |     |  +-INDEX   RANGE SCAN  TEST_PK
    |     +-TABLE ACCESS   BY INDEX ROWID  TEST001
    +-VIEW
       +-SORT   GROUP BY
          +-VIEW
             +-SORT   GROUP BY
                +-NESTED LOOPS   OUTER
                   +-NESTED LOOPS   OUTER
                   |  +-NESTED LOOPS   OUTER
                   |  |  +-HASH JOIN
                   |  |  |  +-NESTED LOOPS
                   |  |  |  |  +-NESTED LOOPS
                   |  |  |  |  |  +-NESTED LOOPS   OUTER
                   |  |  |  |  |  |  +-TABLE ACCESS   BY INDEX ROWID  TEST002
                   |  |  |  |  |  |  |  +-INDEX   RANGE SCAN  TEST002_PK
                   |  |  |  |  |  |  +-TABLE ACCESS   BY INDEX ROWID  TEST003
                   |  |  |  |  |  |     +-INDEX   RANGE SCAN  TEST003_PK
                   |  |  |  |  |  +-INDEX   UNIQUE SCAN  TEST003_PK
                   |  |  |  |  +-TABLE ACCESS   BY INDEX ROWID  TEST003
                   |  |  |  +-TABLE ACCESS   FULL  TEST003
                   |  |  +-VIEW
                   |  |     +-TABLE ACCESS   BY INDEX ROWID  TEST003
                   |  |        +-INDEX   RANGE SCAN  TEST003
                   |  |           +-TABLE ACCESS   BY INDEX ROWID  TEST003
                   |  |           |  +-INDEX   UNIQUE SCAN  TEST003_PK
                   |  |           +-REMOTE      TEST004
                   |  +-REMOTE      TEST004
                   +-REMOTE      TEST005

このような実行計画、いったい何がどうなっているのか、どのように解析をしていったらいいのでしょう?

何か分かりやすく解説しているサイトや書籍はないものでしょうか?

いろいろ調べてみまして、ネストの深いところから実行されることと、「TABLE ACCESS   FULL」は、テーブルフルスキャンをしている事はわかりました。

しかしながら、「FILTER」「NESTED LOOPS」「VIEW」「REMOTE」このあたりの用語の意味がわかりません。

この用語の意味だけでも教えて頂けますとありがたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • himakuma

    2016/11/10 18:52

    Oracleですか??

    キャンセル

  • GiveAHand

    2016/11/10 20:46

    すいません。はいOracleです。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/11/10 20:52

    ACCESS FULL どう考えてもこれで過ぎ

    キャンセル

回答 3

checkベストアンサー

+4

このサイトで十分にわかると思います。

実行計画の操作一覧 - オラクル・Oracleをマスターするための基本と仕組み
http://www.shift-the-oracle.com/performance-tuning/explain-plan-operation.html

>しかしながら、「FILTER」「NESTED LOOPS」「VIEW」「REMOTE」このあたりの用語の意味がわかりません。

一応一つ一つ。
「FILTER」レコードの絞り込みをしています。あまり気にしなくていいです。
「NESTED LOOPS」テーブル間の結合方法です。あまり気にしないでいいです。
「VIEW」検索結果の中間処理で内部でVIEW化しているだけです。気にしなくていいです。
「REMOTE」リモート接続でデータを取得しています。別DBなどからDBリンクで取得しているのでしょう。あまり気にしなくていいです。

つまりあなたが気にしているところは割とどうでもいいことです。
重要なのは、どう結合されているか、レコードをどう取得しているか、どのような性質のテーブルなのか、コストはどうなのかなどです。

「TABLE ACCESS BY INDEX ROWID」でアクセスしたほうがいいこともあれば「TABLE ACCESS FULL」でアクセスしたほうがいいこともあります。どちらがいいか判断し、逆の方法でアクセスしていたらヒント句で固定したりします。「TABLE ACCESS FULL」だから遅い、なんて思いこみだけは絶対にしてはいけません。

ぱっと見で気になるのは、TEST003に何度もアクセスしているところです。5回?。こんなにアクセスする必要ありますか?SQLの作りが悪いように感じます。TEST001も同様です。普通に素直にアクセスするSQLに書き換えられないか考えてみてください。

あとREMOTEのTEST004とTEST005がどちらもOUTERなのも気になります。そこもどうにかなりませんか?

さほど複雑なSQLでもないので、経験の少ない方でもがんばればなんとかなると思います。頑張ってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/12 00:44

    miu_ras様

    大変わかすいご回答、ありがとうございます!

    なるほど、用語の意味よりも、実際がどうなのかということなのですね。

    教えて頂いたページを見てもまだちんぷんかんぷんなところありますが、動作確認で理解を深めていきたいと思います。

    ありがとうございました!

    キャンセル

+1

miu_ras さんと同意見です。
差支えない範囲で実際のUPDATE文、各テーブルのレコード件数、CREATE TABLE, CREATE INDEX、
EXPLAIN PLAN を使って実行計画を取得する 
で SQL*Plusから
SET LINESIZE 200
EXPLAIN PLAN SQL(上記で実行したUPDATE文) ;
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY()) ;
を提示されては?

[Oracle]タグは追加しましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/12 09:22

    Orlofsky様

    ご回答ありがとうございます。
    EXPLAIN PLANで見てみました。

    結果、より細かくわかりましたが、
    どう改善していくかは、またこれからですね。。。(^^;

    miu_ras様、Panzer_vor様のご意見を参考に、
    いろいろ頑張ってみます。

    ありがとうございました!

    キャンセル

+1

先ず始めにSQLを掲示できるレベルで掲示した方が、
回答者側も課題を共有しやすいので掲示できるならする方が良いでしょう。

ともあれ実行計画を見た感じだと、
無駄にサブクエリが使われている印象しかないので、
不要部分のカット、または別のアプローチを取れば速度改善は望めるでしょう。

後はSQLを段階的に分割して流すなどして、
時間がかかっている所を割り出すというやり方も有用です。

ちなみに同じようなサブクエリが何度も登場するなら、
最近のDBMSは軒並み共通テーブル式(CTE)をサポートしているので、
それへ置き換えることで速度改善を図るというのも一つの案でしょうね。

実行計画の中身について

現在の質問者さんもレベルでは、
恐らく実行計画の単語の意味が分かったところで劇的に理解が深まることはない気がします。

Oracleに限らず、
いずれのDBMSも一般的な結合方法、インデックス項目の検索、非インデックス項目の検索には
大きな違いがないため、
この辺りの知識を深めるとどのDBMSを相手としてもある程度通用するスキルは身につくと思われます。

ただし一般論となりOracle特化の内容ではないので、興味がなければ読み飛ばしてください。

例えば結合方法だったら、

  • NESTED LOOP(入れ子ループ)
  • HASH JOIN(ハッシュ結合)
  • SORT MERGE JOIN(マージ結合)

などがあります。
(※それぞれ特徴があるので調べてみてね。)
ただ結合方法は基本的にはDBMS側が最適なアルゴリズム選択をしてくれるので、
あまり気にする機会は少ないかなと思われます。

次にインデックス項目の検索方法ですが、これは大きく2種類となります。

  • インデックス一意スキャン
  • インデックス範囲スキャン

上記はインデックスが利用された検索となるので、
大量にあるレコードから絞り込む際には威力を発揮します。

他にもインデックスはソートされた状態で管理されるという特性があるため、
GROUP BYやORDER BYなどソートが伴う処理ではインデックスを使わせて高速化という手法もあります。

ちなみにOracleの実行計画における、
TABLE ACCESS   BY INDEX ROWIDというのは、
インデックス検索から物理レコードへのマッピングが行われている処理となります。
(要するにインデックスで検索済ませてから、物理レコードを取りにいっている)

最後に非インデックス項目の検索についてですが、
これは説明するまでもないですがインデックスを利用しないでは、
まず物理レコードを持ってきてからフィルタリングを行うことになります。
(OracleだとFilter(抽出条件)と表示されたはず)
この辺りはこちらが参考になります。

長くなりましたが、
この辺りの周辺知識を充実させているほど実行計画をより噛み砕けるので、
興味があったら勉強してみると良いかもしれませんね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/12 09:08

    Panzer_vor様

    お返事遅くなりました。
    すみません。

    大変分かりやすく、濃い内容をありがとうございます。

    結合方式の用語の意味であれこれ悩むよりも、
    インデックスやソートの方式を理解して、あれこれ試すのがよさそうですね。

    共通テーブル式(CTE)に関しても初めて知りました。
    試してみます。

    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる