ablog

不器用で落着きのない技術者のメモ

SQLテスト・ケース・ビルダーで再現ケースを作成する

実行計画絡みの性能トラブルシューティングでよく使うので書いておきます。

エクスポート

共有プールに共有カーソルのキャッシュが残っている場合
  • データベースにログオンする
sqlplus / as sysdba
  • 共有プールに共有カーソルがキャッシュされているか確認する
SELECT COUNT(1) FROM V$SQL WHERE SQL_ID='a5ks9fhw2v9s1' AND PLAN_HASH_VALUE=272002086;
  • キャッシュが残っていない場合、SQL_ID: a5ks9fhw2v9s1 のSQLSQL*Plusなどから実行後、1の手順でキャッシュされていることを確認する。*1
  • テストケースを作成する
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;

インポート

  • テストケースを任意のディレクトリオブジェクトに配置する。*2
  • インポートする
BEGIN
    DBMS_SQLDIAG.IMPORT_SQL_TESTCASE(
    directory => 'TEMP_DIR'         --再現ケース配置先ディレクトリ
   ,importdata => false            --データをIMPORTするか
   ,importpkgbody => true             --依存パッケージをIMPORTするか
   ,filename => 'tc_a5ks9fhw2v9s1_272002086_main.xml'
     );
END;
/

参考

*1:SQL_ID と PLAN_HASH_VALUE が変わらないようアプリケーションから発行されるのとバインド変数名、スペース、改行含め全く同じSQL文で実行する

*2:解凍したもの