liguofeng29’s blog

個人勉強用ブログだっす。

Oracle - 行移行、行連鎖調査

1. CHAINED_ROWS テーブルの定義(初回のみ実施)

sqlplus sys/パスワード as sysdba

@$ORACLE_HOME/rdbms/admin/utlchain.sql

truncate table chained_rows;

2. 行連鎖、行移行に関する統計情報の取得

ANALYZE TABLE スキーマ名.テーブル名 LIST CHAINED ROWS INTO CHAINED_ROWS;

いちいちテーブル毎に発行するのがメンドウなら、こんな感じで。

DECLARE

BEGIN

FOR CUR IN (SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='スキーマ名') LOOP

EXECUTE IMMEDIATE 'ANALYZE TABLE スキーマ名.' ||CUR.TABLE_NAME||' LIST CHAIN ROWS INTO CHAINED_ROWS';

END LOOP;

END;

/

このコマンドの実行によって、SQL の最適化時に利用されるコストに関する統計情報は更新されないので安心してこの SQL を発行してOKです。

3. 取得した行連鎖、行移行に関する統計情報の閲覧

SELECT COUNT(*),TABLE_NAME FROM CHAINED_ROWS GROUP BY TABLE_NAME;

これでこんな感じの結果が出てくると思います。

COUNT(*) TABLE_NAME

---------- ------------------------------

10 テーブル1

6671 テーブル2