SQLの実行計画取得(DBMS_XPLAN.DISPLAY_CURSOR)

Oracle Databaseで、SQLの実行計画を確認したい時に利用するSQLを残しておく。

はじめに

実行計画の取得方法は様々あるが、SELECT文で比較的簡単に取得できる、DBMS_XPLAN.DISPLAY_CURSORを使用した方法を記載する。

前提

実行環境は以下となる。

  • OSバージョン
    • Windows Server 2016 Standard
  • Oracle Databaseバージョン
    • Oracle Database 12C

クエリを実行する場合、実行ユーザに以下のSELECT権限が必要となる。

  • V$SQL_PLAN_STATISTICS_ALL
  • V$SQL
  • V$SQL_PLAN

準備

今回、実行計画を取得するために、V$SESSION(セッション情報)のSQL_IDを利用する。
このSQL_IDを基に、実行計画を取得したいSQLを指定する。

以下、クエリを実行し、SQL_IDを取得する。
※稀にSQL_IDがNULLになっていることがあり、取得できない場合がある。
※条件が必要なため、USERNAME(実行計画を取得したいクエリの実行ユーザ)またはTERMINAL(実行端末)などで、対象セッションを絞る。

SELECT * FROM V$SESSION

実行計画取得

セッションを特定し、SQL_IDが分かったら、以下のクエリにSQL_IDを当てはめて実行する。

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('V$SESSIONで取得したSQL_ID'))

また、同じSQL_IDでも、子カーソル番号(V$SESSIONのCHILD_NUMBER)が異なると実行計画が異なるため、各子カーソル番号ごとに実行計画を取得したい場合は、以下を利用する。

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('V$SESSIONで取得したSQL_ID',V$SESSIONで取得したCHILD_NUMBER))

利用場面

実行計画の確認を実施する場面は、主に2つある。

  • 開発中のクエリ効率の確認
  • 本番処理のパフォーマンス低下

クエリを書き換えてチューニングする場合にコスト値や想定しているインデックスが利用されているかなどを確認するために利用する。
また、本番環境で変更を行っていないクエリのパフォーマンス低下が見られた場合は、CHILD_NUMBERの違いで、該当クエリが違う実行計画を使っていないか確認し、実行計画の違いを比較することで、パフォーマンス低下の原因調査をおこなうことができる。

まとめ

実行計画はSELECTで簡単に取得できるため、開発中のクエリのコストの比較や、パフォーマンス低下の調査に役立てると良い。

コメント

タイトルとURLをコピーしました