[SQL Server]어떤 인덱스가 필요할까?

Updated:

내가 운영중인 DB에는 어떤 인덱스가 필요할까?

또는,

인덱스를 만들려고 하는데 컬럼 1개로만 만들기 아쉽다.

이 쿼리 뿐 아니라 다른 쿼리도 한번에 커버될수 있는 인덱스를 만들고 싶은데…

모든 쿼리를 찾아볼수도 없고… 이런경우 어떻게 해야 할까?

SQL SERVER (아마도 2005부터)에는 DB에서 실행된 SQL을 바탕으로 공간 인덱스를 제외한,

누락된 인덱스의 후보(또는 권장)를 가지고 있는 DMV가 있다.

Missing index 관련 DMV

Sys.dm_db_missing_index_details

Sys.dm_db_missing_index_groups

Sys.dm_db_missing_index_group_stats

Sys.dm_missing_index_columns(index_handle)

sys.dm_db_missing_index_group_stats_query (SQL SERVER 2019, AZURE SQL 추가)

이들 DMV를 이용하여 아래와 같이 조회하면 누락된 인덱스의 정보를 얻을 수 있다.

SELECT	TOP 10 
		ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)		AS [Total Cost],
		avg_user_impact,
		statement																		AS TableName,
		equality_columns																AS [EqualityUsage],
		inequality_columns																AS [InequalityUsage],
		included_columns																AS [Include Cloumns]
FROM	sys.dm_db_missing_index_groups g	
INNER JOIN sys.dm_db_missing_index_group_stats s 
ON	s.group_handle	= g.index_group_handle 
INNER JOIN sys.dm_db_missing_index_details d 
ON	d.index_handle	= g.index_handle

ORDER BY [Total Cost] DESC

[결과]

많은 쿼리가 수행되면 테이블별로 몇십개의 내역이 조회됨을 알수 있다. (모든 인덱스를 만들수는 없다!)

따라서 가장 BEST는 쿼리를 직접보고 튜닝하는 것이다.

하지만, 비용이 높고 컬럼의 순서등을 고려하여 여러개의 쿼리를 커버할수 있는 인덱스를 만드는데는

유용하게 활용할 수 있다.

참조 - missingIndex