パフォーマンス計測する際に活躍します。SQLを1度目実行した時より、2度目実行した時のほうがほぼ早くなると思いますが、その理由の一つがSQLで利用するテーブルや、インデックスがバッファー・キャッシュ(メモリ)にキャッシュオンしている事です。これをクリアする方法がこちらです。
事前にどんなオブジェクトがキャッシュされているか確認
キャッシュされている状況確認SQL
select o.OWNER, o.OBJECT_TYPE,o.OBJECT_NAME, o.STATUS, count(*) BLOCKS from V$BH b inner join DBA_OBJECTS o on b.OBJD = o.DATA_OBJECT_ID where 1=1 and b.TS# > 0 -- 表領域0番は対象から外す and b.STATUS <> 'free' -- and o.OWNER = 'SOONI' group by o.OWNER,o.OBJECT_TYPE, o.OBJECT_NAME, o.STATUS order by 1, 2, 3;
確認SQL実行例
SQL> set lin 200
SQL> COLUMN OWNER FORMAT A20
SQL> COLUMN OBJECT_TYPE FORMAT A24
SQL> COLUMN OBJECT_NAME FORMAT A30
SQL> COLUMN STATUS FORMAT A10
SQL> select
2 o.OWNER, o.OBJECT_TYPE,o.OBJECT_NAME, o.STATUS, count(*) BLOCKS
3 from V$BH b inner join DBA_OBJECTS o
4 on b.OBJD = o.DATA_OBJECT_ID
5 where
6 1=1
7 and b.TS# > 0 -- 表領域0番は対象から外す
8 and b.STATUS <> 'free'
9 --and o.OWNER = 'SOONI'
10 group by o.OWNER,o.OBJECT_TYPE, o.OBJECT_NAME, o.STATUS
11 order by 1, 2, 3
12 ;
OWNER OBJECT_TYPE OBJECT_NAME STATUS BLOCKS
------------------------------ ------------------------ ------------------------------ -------------- ----------
APEX_040200 INDEX REPORT_COLUMN_PK VALID 1
APEX_040200 INDEX WWV_FLOW_BUTTON_TEMP_IDX2 VALID 1
APEX_040200 INDEX WWV_FLOW_COMPANIES_IDX2 VALID 1
APEX_040200 INDEX WWV_FLOW_FLASH_MAP_REG_PK VALID 1
APEX_040200 INDEX WWV_FLOW_INSTALL_SCRIPTS_IDX1 VALID 1
APEX_040200 INDEX WWV_FLOW_LISTS_FKIDX VALID 1
APEX_040200 INDEX WWV_FLOW_LISTS_PK VALID 1
APEX_040200 INDEX WWV_FLOW_LIST_ITEMS_FKIDX VALID 1
APEX_040200 INDEX WWV_FLOW_LIST_ITEMS_IDX1 VALID 1
APEX_040200 INDEX WWV_FLOW_LIST_ITEMS_IDX2 VALID 1
APEX_040200 INDEX WWV_FLOW_LIST_ITEMS_PK VALID 1
※かなりたくさん出力されるはずです、、、
データベース・バッファ・キャッシュのクリア
クリアするSQL
ALTER SYSTEM FLUSH BUFFER_CACHE ;
クリアSQL実行例
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE
2 ;
システムが変更されました。
SQL>
これでバッファー・キャッシュはクリアできていますが、実はOSのキャッシュに乗ったままで「実質キャッシュアウトされていない」って状況もあり得ますので注意してくだい。それから、SQLの2回目が早くなるもう一つの理由がSQLのパース結果が共有プールに残っている事です。より正確な計測を求めるには共有プールのクリアも必要です。