データ・ディクショナリ

DBA_TAB_MODIFICATIONS テーブルの更新状況を調べる

DBA_TAB_MODIFICATIONSで前回統計情報取得からの更新状況が分かります

DBA_TAB_MODIFICATIONS/USER_TAB_MODIFICATIONSは前回統計情報取得後からテーブルへの変更がどのように行われたのか知る事ができます。ただしこのVIEWから取得できるのは「近似値」であると言う事がマニュアルにも記載されています。パフォーマンス上の理由から、DBA_TABLES.MONITORING=’YES’となっているテーブルが対象でかつ、実際のテーブルが更新された場合統計情報への繁栄に多少タイムラグがあるように、このVIEWへの繁栄もラグがあるようです。最新の情報に反映するにはFLUSH_DATABASE_MONITORING_INFOプロシージャを実行するとよいです。「このテーブルってどの程度更新入っているのかな?」と軽く調べる時活躍しています。

select
 m.TABLE_OWNER
,m.TABLE_NAME
,t.last_analyzed "基準日"
,m.ins "基準日からのinsert件数"
,round(m.ins / to_number(sysdate - t.last_analyzed),2) "INSERT件数/日"
,m.upd "基準日からのupdate件数"
,round(m.upd / to_number(sysdate - t.last_analyzed),2) "UPDATE件数/日"
,m.del "基準日からのdelete件数"
,round(m.del / to_number(sysdate - t.last_analyzed),2) "DELETE件数/日"
from
dba_tables t inner join
(
    select t.TABLE_OWNER,t.TABLE_NAME
    ,sum(t.INSERTS) ins
    ,sum(t.UPDATES) upd
    ,sum(t.DELETES) del
    from dba_tab_modifications t 
    inner join dba_users u
    on t.TABLE_OWNER = u.USERNAME and u.COMMON ='NO'
    where not exists (
         select 1 from dba_recyclebin b 
         where t.TABLE_NAME = b.OBJECT_NAME 
         and t.TABLE_OWNER  = b.OWNER
         and b.TYPE         ='TABLE'
    )
    group by t.TABLE_OWNER,t.TABLE_NAME
) m
on  t.TABLE_NAME = m.TABLE_NAME
and t.OWNER      = m.TABLE_OWNER
where
t.last_analyzed is not null
order by 1,2
;
出力イメージ
スポンサーリンク
タイトルとURLをコピーしました