본문 바로가기
SQL Server/index

[MSSQL] 인덱스 사용률(index usage)을 활용한 인덱스 정리

by 쏭냥쏭냥 2022. 12. 5.

주로 아래의 경우 인덱스 사용률을 확인하여 인덱스 정리를 진행하고 있다.

-대용량 데이터 테이블로 생성된 지 오래된 테이블

(과거의 사용 용도와 달라졌을 경우가 있고, 이전에 사용되던 조건들이 현재에는 쓰이지 않을 경우가 많아 인덱스 정리가 필요)

-선두 컬럼이 같은 넌클러스터 인덱스가 여러 개 존재하거나 비슷한 컬럼 구성으로 넌클러스터 인덱스가 여러 개 존재하는 테이블

(생성 당시에는 사용할 것으로 판단하여 생성했지만 인덱스 힌트를 강제로 주지 않는 이상 옵티마이저가 선택하지 않아 사용되지 않는 인덱스들이 있음)

 

select  
i.type_desc as index_type    
, i.name as index_nm    
, iu.user_seeks as seek_cnt    
, iu.user_scans as scan_cnt    
, iu.user_lookups as lookup_cnt    
from sys.dm_db_index_usage_stats iu    
Inner join sys.tables tb on iu.object_id = tb.object_id    
left join sys.indexes i on iu.object_id = i.object_id AND iu.index_id = i.index_id    
where tb.name = ''    
order by index_type, seek_cnt desc

-where 조건의 tb.name 부분에 조회하고자 하는 테이블 명을 입력

-조회 컬럼 설명

type_desc : 인덱스 종류(clustered/nonclustered)

user_seeks : 인덱스 seek 횟수

user_scans : 인덱스 스캔 횟수

 

**주의 : 간혹 자주 호출되지 않거나 현재는 잠시 중단 중인 업무의 쿼리에 인덱스 힌트로 고정되어 있는 경우가 있다.
인덱스를 drop한 이후에 해당 쿼리가 호출되면 오류가 발생하기 때문에 인덱스 정리 전에는 항상 개발팀과 공유하여 사용하지 않는 인덱스가 맞는지 체크해야 한다.

댓글