성능분석 13탄 – 누락된 인덱스(missing index)

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

 

SQL Server에서 누락된 인덱스는 성능 문제를 일으킬 수 있다. 누락된 인덱스(missing index)는 인덱스가 생성되어 있지만 사용되지 않는 인덱스이다.

 

SQL Server 2005 부터는 누락된 인덱스를 확인하기 위한 DMV가 제공되고 있다. 다음 DMV를 활용하여 누락된 인덱스의 정보를 확인 할 수 있다.

  • Sys.dm_db_missing_index_details : 누락된 인덱스에 대한 상세 정보 반환
  • Sys.dm_db_missing_index_group_stats : 누락 된 인덱스 그룹에 대한 요약 정보 반환
  • Sys.dm_db_missing_index_groups : 누락 된 인덱스의 특정 그룹에 대한 반품 정보 반환
  • Sys.dm_missing_index_columns(index_handle) : 인덱스에 대한 누락된 데이터베이스테이블 컬럼에 대한 정보를 반환.

 

 

아래 스크립트는 DMV를 활용하여 쿼리가 실행되고 있는 데이터베이스에 누락된 인덱스를 식별하고 비용이 높은 쿼리를 찾아 인덱스를 생성하는 가이드를 제공한다.

SELECT

    a.avg_user_impact * a.avg_total_user_cost * a.user_seeks,

db_name(c.database_id),

OBJECT_NAME(c.object_id, c.database_id),

c.equality_columns,

c.inequality_columns,

c.included_columns,

c.statement,

'USE [' + DB_NAME(c.database_id) + '];

CREATE INDEX mrdenny_' + replace(replace(replace(replace

(ISNULL(equality_columns, '')

+ ISNULL(c.inequality_columns, ''), ', ', '_'),

'[', ''), ']', ''), ' ', '') + '

ON [' + schema_name(d.schema_id) + ']

.[' + OBJECT_NAME(c.object_id, c.database_id) + ']

(' + ISNULL(equality_columns, '') +

CASE WHEN c.equality_columns IS NOT NULL

AND c.inequality_columns IS NOT NULL THEN ', '

ELSE '' END + ISNULL(c.inequality_columns, '') + ')

' + CASE WHEN included_columns IS NOT NULL THEN

'INCLUDE (' + included_columns + ')' ELSE '' END + '

WITH (FILLFACTOR=70, ONLINE=ON)'

FROM sys.dm_db_missing_index_group_stats a

JOIN sys.dm_db_missing_index_groups b

ON a.group_handle = b.index_group_handle

JOIN sys.dm_db_missing_index_details c

ON b.index_handle = c.index_handle

JOIN sys.objects d ON c.object_id = d.object_id

WHERE c.database_id = db_id()

ORDER BY DB_NAME(c.database_id),

ISNULL(equality_columns, '')

+ ISNULL(c.inequality_columns, ''), a.avg_user_impact

* a.avg_total_user_cost * a.user_seeks DESC

 

 

DMV로 확인한 정보를 이용하여 인덱스를 생성하거나 수정 할 때 중복 인덱스가 있는지 또는 다른 쿼리가 영향을 받는지 충분한 검토가 필요하다.

 

[참고자료]

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 1255
1966 SQL Server Agent에서 CmdExec 오류 jevida(강성욱) 2016.11.23 2347
1965 Verbose SQL Server Agent Logging jevida(강성욱) 2016.11.23 1756
1964 Windows Event Log에 SQL Server Agent Log 기록 jevida(강성욱) 2016.11.23 2350
1963 SQL Server Agent Error log 위치 변경 jevida(강성욱) 2016.11.23 2610
1962 SQL Server에서 차단을 확인하는 다양한 방법 jevida(강성욱) 2016.10.18 4664
1961 SQL Server CPU 사용률이 높은 프로세서 및 쿼리 찾기 jevida(강성욱) 2016.10.18 7246
1960 Collation 변경 jevida(강성욱) 2016.10.18 4636
1959 인덱스 리빌드 동작 (Gather Streams from SORT) jevida(강성욱) 2016.10.18 3503
1958 최소한의 다운타임으로 데이터베이스 이동하기 jevida(강성욱) 2016.10.18 3169
1957 백업 LSN 이해하기 jevida(강성욱) 2016.10.18 3470
1956 암호화 오버헤드 (작성자의 주관적인 자료임) jevida(강성욱) 2016.10.18 2872
1955 데이터베이스 연결 정보 수집 jevida(강성욱) 2016.10.18 3211
1954 FileStream Garbage Collection jevida(강성욱) 2016.10.18 3475
1953 프로시저 캐시에서 중복 쿼리 계획 확인 jevida(강성욱) 2016.10.18 3709
1952 Sp_reset_connection jevida(강성욱) 2016.10.18 3582
1951 성능분석 17탄 – SQLServer 블록킹 / 네트워크 관련 성능 카운터 jevida(강성욱) 2016.10.15 3768
1950 성능분석 16탄 – 메모리 / CPU 관련 성능 카운터 jevida(강성욱) 2016.10.15 5661
1949 성능분석 15탄 – I/O 관련 성능 카운터 jevida(강성욱) 2016.10.15 4064
1948 성능분석 14탄 – SQL Server 사용 성능 카운터 jevida(강성욱) 2016.10.15 4033
» 성능분석 13탄 – 누락된 인덱스(missing index) jevida(강성욱) 2016.10.15 2411





XE Login