본문 바로가기

IT관련

오라클 DML(Insert, Update, Delete) 빈도를 가늠할 수 있는 DBA_TAB_MODIFICATIONS (테이블 변경 내역)

Oracle 딕셔너리중에 특정 테이블에 DML이 얼마나 빈번하게 이루어지고 있는지를 가늠할 수 있는 딕셔너리 뷰가 있습니다. 바로 DBA_TAB_MODIFICATIONS 입니다.

 

 

USER_TAB_MODIFICATIONS      Information regarding modifications to tables 
ALL_TAB_MODIFICATIONS        Information regarding modifications to tables
DBA_TAB_MODIFICATIONS       Information regarding modifications to tables 

SQL> desc DBA_TAB_MODIFICATIONS
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 TABLE_OWNER                                                    VARCHAR2(128)
 TABLE_NAME                                                     VARCHAR2(128)
 PARTITION_NAME                                                 VARCHAR2(128)
 SUBPARTITION_NAME                                              VARCHAR2(128)
 INSERTS                                                        NUMBER
 UPDATES                                                        NUMBER
 DELETES                                                        NUMBER
 TIMESTAMP                                                      DATE
 TRUNCATED                                                      VARCHAR2(3)
 DROP_SEGMENTS                                                  NUMBER

 

이 딕셔너리를 보면, Insert, Update, Delete 가 얼마나 발생했는지를 가늠해 볼 수 있습니다.

단, 주의할 점은, 이게 원래 감사(Audit) 기능 차원에서 만들어진 게 아니라는 점입니다.

그래서 데이터가 완전히 정확하지는 않습니다.

 

이건 통계정보가 최종적으로 갱신된 후에 그동안 얼마나 변화가 있었는지를 Optimizer가 가늠하기 위해 존재하는 뷰입니다. Optimizer를 위한 뷰인 것이지, 사용자가 감사 목적으로 사용하라고 있는게 아닙니다.

 

그래서 DML 후에 Rollback 을 하는 경우에도 카운트됩니다.

그리고, 해당 테이블에 통계정보를 다시 만드는 순간 데이터는 모든 초기화됩니다.

 

사용자가 DML 을 수행할 때마다 매번 여기에 기록되지도 않습니다. 성능상의 이유로 3시간에 한번씩만 기록되도록 설계되어 있습니다.

이걸 수동으로 기록되도록 커맨드를 실행할 수도 있습니다.

 

SQL> execute DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
PL/SQL procedure successfully completed.

 

위 처럼, Flush~ 커맨드를 사용하면 즉시 딕셔너리에 반영됩니다.