[Oracle] 인덱스 사용여부를 모니터링하는 방법
저희 회사는 Oracle 11gR2 버전을 사용하고 있기 때문에 V$OBJECT_USAGE뷰를 사용하여 생성된 인덱스의 사용여부를 모니터링하는 방법을 알아보겠습니다.
| 컬럼명 | 설명/비고 |
|---|---|
| INDEX_NAME | 모니터링 대상이 된 인덱스의 이름입니다. |
| TABLE_NAME | 해당 인덱스가 설정되어 있는 테이블의 이름입니다. |
| MONITORING | 현재 이 인덱스를 감시 중인지 여부를 나타냅니다.(YES: 감시 중, NO: 감시 종료) |
| USED | 모니터링 시작 이후 실제로 사용된 적이 있는지 여부입니다.(YES: 최소 1회 사용됨, NO: 한 번도 사용 안 됨) |
| START_MONITORING | 모니터링을 시작한 시각입니다. ALTER INDEX … MONITORING USAGE 실행 시점 |
| END_MONITORING | 모니터링을 종료한 시각입니다. ALTER INDEX … NOMONITORING USAGE 실행 시점 |
- 모니터링 대상 인덱스 선정
- 인덱스 모니터링 시작
- 인덱스 사용여부 확인
- 인덱스 모니터링 종료
1. 모니터링 대상 인덱스 선정
- DBA_INDEXES 뷰를 통해 인덱스 모니터링을 위한 DDL을 생성합니다. INVALID 인덱스는 모니터링할 수 없어서 VALID 상태의 인덱스만을 대상으로 모니터링합니다.
SELECT INDEX_NAME, INDEX_TYPE, TABLE_OWNER, TABLE_NAME, 'ALTER INDEX ' || OWNER || '.' || INDEX_NAME || ' MONITORING USAGE;' AS MONITORING_DDL, 'ALTER INDEX ' || OWNER || '.' || INDEX_NAME || ' NOMONITORING USAGE;' AS NOMONITORING_DDL, 'SELECT * FROM V$OBJECT_USAGE WHERE INDEX_NAME = ''' || INDEX_NAME || ''';' AS USED_YN_DML FROM DBA_INDEXES WHERE OWNER = '스키마명' AND STATUS = 'VALID';
2. 인덱스 모니터링 시작
- MONITORING_DDL을 실행하여 인덱스의 사용여부를 모니터링하기 시작합니다. V$OBJECT_USAGE뷰에 동일한 인덱스가 등록되어 있으면 기존 모니터링 정보는 삭제되고 다시 등록됩니다.
ALTER INDEX 스키마.인덱스 MONITORING USAGE;
3. 인덱스 사용여부 확인
- 일정기간 인덱스의 사용여부를 모니터링한 후 USED_YN_DML를 실행하여 V$OBJECT_USAGE뷰의 USED 컬럼을 확인합니다. 만일 관리자 계정으로 확인하려면 아래 쿼리를 사용합니다.
SELECT u.name AS owner, io.name AS index_name, t.name AS table_name, DECODE(BITAND(i.flags, 65536), 0, 'NO', 'YES') AS monitoring, DECODE(BITAND(ou.flags, 1), 0, 'NO', 'YES') AS used, ou.start_monitoring, ou.end_monitoring FROM sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ou, sys.user$ u WHERE io.obj# = ou.obj# AND t.obj# = i.bo# AND i.obj# = ou.obj# AND io.owner# = u.user# AND io.name = 'TB_MAIL_INFO_BINDEX'; -- 인덱스명을 대문자로 입력하세요
4. 인덱스 모니터링 종료
- NOMONITORING_DDL을 실행하여 인덱스의 사용여부 모니터링를 종료합니다. V$OBJECT_USAGE뷰의 END_MONITORING 컬럼에 모니터링 종료시간이 기록됩니다.
ALTER INDEX 스키마.인덱스 NOMONITORING USAGE;
