実行計画絡みの性能トラブルシューティングでよく使うので書いておきます。
エクスポート
共有プールに共有カーソルのキャッシュが残っている場合
- データベースにログオンする
sqlplus / as sysdba
- 共有プールに共有カーソルがキャッシュされているか確認する
SELECT COUNT(1) FROM V$SQL WHERE SQL_ID='a5ks9fhw2v9s1' AND PLAN_HASH_VALUE=272002086;
DECLARE V_TESTCASE CLOB; BEGIN DBMS_SQLDIAG.EXPORT_SQL_TESTCASE( DIRECTORY => 'TEMP_DIR', /* ディレクトリオブジェクトを指定 */ sql_id => 'a5ks9fhw2v9s1', plan_hash_value => 1001824601, exportData => FALSE, exportPkgbody=>TRUE, testcase_name => 'tc_a5ks9fhw2v9s1_272002086_', testcase => V_TESTCASE); END; /
- テストケースを圧縮回収する
select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME = 'TEMP_DIR'; ! cd /path/to/dir # ↑で確認した DIRECTORY_PATH に移動する tar cfvz tc_tc_a5ks9fhw2v9s1_272002086.tar.gz tc_tc_a5ks9fhw2v9s1_272002086_*
- tc_tc_a5ks9fhw2v9s1_272002086.tar.gz を回収する。
共有プールに共有カーソルのキャッシュが残っていない場合
- データベースにログオンする
sqlplus / as sysdba
- SQL文を変数として定義する
create or replace package define_vars is sql_stmt1 varchar2(32767) := q'# SELECT * FROM DUAL #'; end; /
- テストケースを作成する
DECLARE V_TESTCASE CLOB; BEGIN DBMS_SQLDIAG.EXPORT_SQL_TESTCASE( DIRECTORY => 'TEMP_DIR', -- ディレクトリオブジェクトを指定 SQL_TEXT => define_vars.sql_stmt1, -- 定義した SQL 文字列 USER_NAME => 'SCOTT', -- SQL の解析に使用されるユーザー名 exportData => FALSE, exportPkgbody=>TRUE, testcase_name => 'tc_7f30cth1vgygw_1001824601_', testcase => V_TESTCASE); END; /
- テストケースを圧縮回収する
select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME = 'TEMP_DIR'; ! cd /path/to/dir # ↑で確認した DIRECTORY_PATH に移動する tar cfvz tc_7f30cth1vgygw_1001824601.tar.gz tc_7f30cth1vgygw_1001824601_*
- tc_7f30cth1vgygw_1001824601.tar.gz を回収する。
- パッケージ変数を削除する
drop package define_vars;
インポート
BEGIN DBMS_SQLDIAG.IMPORT_SQL_TESTCASE( directory => 'TEMP_DIR' --再現ケース配置先ディレクトリ ,importdata => false --データをIMPORTするか ,importpkgbody => true --依存パッケージをIMPORTするか ,filename => 'tc_a5ks9fhw2v9s1_272002086_main.xml' ); END; /
参考
- SQL 実行時の問題を解析するための SQL テスト・ケースを作成する方法(KROWN:152185) (Doc ID 1755074.1)
- 再現ケースを簡単に作成!SQLテスト・ケース・ビルダーの使用方法 | アシスト
- https://docs.oracle.com/cd/E49329_01/server.121/b71277/tgsql_stcb.htm