EXPLAIN PLANでの実行計画取得
複数のTABLEをJOINしたSELECT文などのSQL文で処理が重たい場合、
SQL分の実行計画からどこの処理が重たいかを確認することができます。
実行計画はSQL文の前にEXPLAIN PLAN文を付ける事で取得できます。
EXPLAIN PLAN FOR SELECT * FROM [table_name];
この文でSQL文の実行計画をPLAN_TABLEという表に格納されます。
格納した実行計画を表示する方法はいくつかありますが、
僕は以下の表関数を用いて出力しました。10g以上対応ですが。
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
出力結果例は以下のようなものになります。
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY()); Plan hash value: 2520579295 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 4 | 1 (0)| 00:00:01 | |* 1 | INDEX RANGE SCAN| TEST_IX1 | 1 | 4 | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("NUM"=1)
where句やfilterを用いているとPredicate Informationに表示されます。
Timeが劇的に増えたIdでaccessやfilterがあった場合そこを疑う。
という方法でSQL文を調査することができます。