インデックスの不足を調べる


sys.dm_db_missing動的ビューを用いると不足していると思われるインデックスがわかる。
そのデータベース上で特にインデックスが不足していると推測されるものを探すSQLは以下の通り。

SELECT  TOP 10 
        [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 
        , avg_user_impact
        , statement AS テーブル名
        , equality_columns   as 等号列
        , inequality_columns as 不等号列
        , included_columns   as 付加列
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;


上記でコストが高いものがあれば、等号列と不可等号列、付加列をINCLUDEに含めたインデックスを作成してみるとよい

CREATE NONCLUSTERED INDEX [tbl_IX01] ON [dbo].[tbl] 
(
	[col1] ASC,
	[col2] ASC
)
INCLUDE ( 
[col3], [col4],
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO


動作確認環境:SQL Server 2008