2014年10月12日日曜日

SQL長時間化調査の際にはDBMS_XPLAN.DISPLAY_CURSORを使おう

SQLの長時間化が発生した時に、SQLの実行計画を確認すると思いますが、その際に確認する方法としてexplain planがありますが、
explain planはSQLの実行時と同一環境でないとならないため、必ずしも正確でないことがあります。
また、Oracleのマニュアルでは、「一般にバインド変数では、EXPLAIN PLANが実際の実行計画を表していない場合があります」とあります。
※最近、explain planでSQL実行計画を調査し、失敗してしまったことがありました。

そんなときに確認したいのが、v$sql_planです。
v$sql_planは共有プール内の実行計画情報ですので、同一環境をセットアップする必要がありません。
また、10gからは便利なプロシージャが用意されています。
DBMS_XPLAN.DISPLAY_CURSOR


DBMS_XPLAN.DISPLAY_CURSOR(
   sql_id           IN  VARCHAR2  DEFAULT  NULL,
   cursor_child_no  IN  NUMBER    DEFAULT  0,
   format           IN  VARCHAR2  DEFAULT  'TYPICAL');

例)
SQL ID 'abcdefghijk'に関連付けられたすべての子の実行計画を表示する
SELECT * FROM table (DBMS_XPLAN.DISPLAY_CURSOR('abcdefghijk'));

SQL ID 'abcdefghijk'に指定されているカーソルに対するランタイム統計を表示する
SELECT * FROM table (DBMS_XPLAN.DISPLAY_CURSOR('abcdefghijk', NULL, 'ALLSTATS LAST');

0 件のコメント:

コメントを投稿