[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는 쿼리를 직접보고 튜닝하는 것이다.
하지만, 비용이 높고 컬럼의 순서등을 고려하여 여러개의 쿼리를 커버할수 있는 인덱스를 만드는데는
유용하게 활용할 수 있다.