2011-07-14 12 views
1

一定期間にOracleデータベースで発生した挿入/更新の総数を取得するにはどうすればよいですか?Oracleデータベースで挿入/更新の回数を取得するにはどうすればよいですか?

+0

AWRテーブルを使用するライセンスはありますか? –

+0

データベース全体または特定のテーブルについて懸念していますか? –

+0

@justin:はい、@ j0rd4n:データベース全体 – Nohsib

答えて

8

すべてのSQL文のデータを保持するようにAWRを構成したとします(STATISTICS_LEVELが「TYPICAL」の場合はデフォルトでCPU、経過時間などで上位30を保持し、STATISTICS_LEVEL

BEGIN 
    dbms_workload_repository.modify_snapshot_settings (
    topnsql => 'MAXIMUM' 
); 
END; 

、あなたは、このいくつかのためにAWRのテーブルを使用することができ、スナップショットは、それらをキャプチャする前に、SQL文がキャッシュの期限がないと仮定してのようなものを経由して「ALL」)です。

あなたはこれらのクエリは、両方のステートメントが含まれていることを、あなたのアプリケーションの問題や文そのOracleいることを注意

SELECT sum(stat.executions_delta) insert_executions 
    FROM dba_hist_sqlstat stat 
     JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id) 
     JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id) 
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>> 
    AND txt.command_type = 2; 

SELECT sum(stat.executions_delta) update_executions 
    FROM dba_hist_sqlstat stat 
     JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id) 
     JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id) 
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>> 
    AND txt.command_type = 6; 

UPDATE文が実行されたことをINSERT文が実行された回数と回数を収集することができますバックグラウンドでの問題特定のSQL文を除外するには、追加の条件を追加することができます。

同様に、あなたは

SELECT count(distinct stat.sql_id) distinct_insert_stmts 
    FROM dba_hist_sqlstat stat 
     JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id) 
     JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id) 
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>> 
    AND txt.command_type = 2; 


SELECT count(distinct stat.sql_id) distinct_update_stmts 
    FROM dba_hist_sqlstat stat 
     JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id) 
     JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id) 
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>> 
    AND txt.command_type = 6; 

個別のINSERTおよびUPDATEステートメントの合計数を得ることができるOracleは、しかし、一定の間隔で挿入または更新された行の数を追跡することはありません。 AWRからその情報を得ることができなくなります。あなたが得ることができる最も近いのは、統計が古くなっているかどうかを判断するために、Oracleの監視を活用しようとすることです。 MONITORINGと仮定すると、各テーブルのために有効になっている(これは、11gのデフォルトであり、私はそれが10グラムで、デフォルトであると考えている)、すなわち

ALTER TABLE table_name 
    MONITORING; 

Oracleは、定期的に、挿入、更新、および削除された行の概数をフラッシュしますテーブルごとにSYS.DBA_TAB_MODIFICATIONSテーブルに追加します。しかし、統計は特定の間隔での活動ではなく、表に集められているので、これは活動を示すだけです。しかし、定期的にこのデータを自分のテーブルに取り込み、それを報告するプロセスを作成しようとすることもできます。

あなたがメモリからディスクに監視情報をフラッシュするためにOracleに指示した場合は(そうでない場合は、数時間までのタイムラグがある)

BEGIN 
    dbms_stats.flush_database_monitoring_info; 
END; 

変更した行数のおおよその数を取得することができます統計が最後に収集されてから各テーブルに表示されます

SELECT table_owner, 
     table_name, 
     inserts, 
     updates, 
     deletes 
    FROM sys.dba_tab_modifications 
関連する問題