データベース-Oracle最近Oracleのパフォーマンスチューニングについて勉強しました。Oracleのパフォーマンスの鍵となるのが、SQLの実行計画。PLAN」と「AUTOTRACE」の2種類の方法があります。PLANによる実行計画の取得方法をまとめます。サンプルテーブルお馴染みのemp表、dept表を使います。BOSTONemp表のdeptnoにはdept表のdeptnoが入ります。PLANによる実行計画の生成、格納。PLAN_TABLEからの実行計画取得。PLANの基本形は次のとおり。<SQL文>;簡単です。このSQLを発行することでSYSスキーマのPLAN_TABLE表に、実行計画が格納されます。PLANで生成した実行計画を取得するには、select文を発行します。PLAN_TABLEから取得しても情報がバラバラで見辛いため、DBMS_XPLAN.DISPLAYファンクションを利用します。DBMS_XPLAN.DISPLAYファンクションは、PLAN_TABLEの情報を集めユーザに見やすい形で実行計画を表示してくれます。TABLEに格納されたSQLの実行計画が抽出されます。実行計画から分かること出力された表によって「OracleがどのようにSQLを解釈しているか」「SQLの実行コスト」といったことが分かります。上記の実行計画からは例えばこんなことが分かります。dept表をフルスキャンして12行が得られるemp表をフルスキャンして12行が得られるempとdeptをハッシュ結合した結果、12行が抽出される。合計コストは18では次に、empとdeptにインデックスを付与して実行計画がどう変わるかを確認してみます。TABLEの取得方法を少し変えてみます。PLANでSTATEMENT_IDを設定することで、任意の実行計画を取得できます。table(dbms_xplan.display('plan_table','<任意のID>'));これに従い、インデックスを付与した後の同じSQLの実行計画を取得します。selected.実行計画の表が変わっていることが分かります。dept表の検索がインデックススキャンに変わっている。これによりdept表からは指定の1件だけ抽出される。emp表とdept表の結合がネステッドループ結合へと変わっている。全体のコスト値が9に減少。これはdept表でのインデックススキャンが可能になったことでOracleのオプティマイザが「ハッシュよりネステッドループの方が効率が良い」と判断したことになります。PLANで取得できる実行計画は「想定される実行計画」です。そのため、実際にSQLを流した際は異なる実行計画が利用される可能性があります。PLANの簡単な使い方でした。PLAN_TABLE表やDBMS_XPLANパッケージの詳細な使い方は公式ガイドを参照しましょう。はてなブログPro学んだ技術まとめるはずが、仙台のことや日常のことを綴っているブログ。(1)スポンサーリンクはてなブログをはじめよう!WorldWorldWorldさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。