반응형
반응형

실제 많은 수의 운영 환경들에서 테이블에 만들어져 있는 인덱스들의 일부는 실제로는 사용되지 않는 인덱스입니다. 실제로 사용되지 않는 인덱스를 관리하는 것은 불필요한 오버헤드만 유발하므로 인덱스 사용여부를 확인하고 실제로 사용되지 않는 불필요한 인덱스들을 구분해 내고 삭제하는 것이 필요합니다.
SQL Server 2005에서 새롭게 제공되는 DMV 중에서 sys.dm_db_index_usage_stats
동적 관리 뷰를 사용하여 사용된 인덱스와 빈도를 있습니다. 뷰를 사용하여 응용 프로그램에서 사용하지 않는 인덱스를 확인할 있으며, 또한 유지 관리 오버헤드를 유발하는 인덱스를 확인할 수도 있습니다.

SQL Server 서비스를 시작할 때마다 카운터는 상태로 초기화되며, 데이터베이스가 분리되거나 종료될 때마다(: AUTO_CLOSE ON으로 설정된 경우) 데이터베이스와 관련된 모든 행이 제거됩니다. 그러므로 DMV에 대한 스냅샷을 영구 테이블에 복사해 둠으로써 SQL Server가 재시작되기 이전의 데이터도 관리하는 것을 권고합니다.

 

다음에 sys.dm_db_index_usage_stats 동적 관리 뷰를 활용한 예제 스크립트가 있습니다. DMV를 활용한 스크립트는 아래 예제 스크립트 외에도 다양하게 작성될 수 있습니다.

Adventureworks 데이터베이스 인덱스 사용현황 확인하기

SELECT * FROM sys.dm_db_index_usage_stats

WHERE database_id = db_id('Adventureworks');

GO

 

사용되지 않은 인덱스 확인하기

SELECT object_name(i.object_id) AS Table_Name, i.name AS Index_Name

FROM sys.indexes i, sys.objects o

WHERE  i.index_id NOT IN

             (SELECT s.index_id

              FROM sys.dm_db_index_usage_stats s

              WHERE s.object_id=i.object_id and

                                       i.index_id=s.index_id and

                                        database_id = db_id() )  -- dbid : db_id() 값을 입력

AND o.type = 'U'

AND o.object_id = i.object_id

ORDER BY object_name(i.object_id) ASC

GO


[주의] 인덱스가 사용되지 않는 인덱스라고 확인되더라도 충분히 오랜 기간 동안 모니터링하지 않았다면 섣불리 인덱스를 삭제해도 무방하다고 판단해서는 안됩니다. 만일 크기가 큰 테이블에 대해서 어떤 응용 프로그램에서 사용하는 인덱스를 실수로 삭제하게 되면 심각한 블로킹과 성능 저하가 발생할 수 있습니다.

반응형

+ Recent posts

반응형