SELECT [Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) , avg_user_impact , TableName = statement , [EqualityUsage] = equality_columns , [InequalityUsage] = inequality_columns , [Include Cloumns] = included_columns 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;
SELECT c.name AS databasename, c.equality_columns, c.inequality_columns, c.included_columns, c.statement AS tablename, c.avg_total_user_cost AS ReducingTheAverageCost, c.avg_user_impact AS PercentageOfRevenue, c.last_user_seek AS TheLastTimeTheEffectAfterUse, c.unique_compiles FROM (SELECT a.name, b.* FROM (SELECT d.*, s.avg_total_user_cost, s.avg_user_impact, s.last_user_seek, s.unique_compiles FROM sys.dm_db_missing_index_group_stats s, sys.dm_db_missing_index_groups g, sys.dm_db_missing_index_details d WHERE s.group_handle = g.index_group_handle AND d.index_handle = g.index_handle AND s.avg_user_impact > 90 --AND s.unique_compiles > 10 --order by s.avg_user_impact desc ) b, sys.databases a WHERE a.database_id = b.database_id) c WHERE c.name = 'xxxxx' ORDER BY PercentageOfRevenue DESC, unique_compiles DESC
固然,按照上面的規則創建索引,不過仍是要創建儘可能少的索引,由於索引建多了,會致使insert、update等操做的開銷增大,下降性能。
還有,在創建了索引後,能夠經過以下的查詢,來查詢索引的使用的狀況:
select *
from sys.dm_db_index_usage_stats
若是,對index_seek的次數,很小,那麼能夠考慮刪除這個索引,再嘗試創建其餘的索引,如此屢次,就能創建真正讓查詢使用的索引,讓這些索引都能發揮做用,同時儘可能減小索引的數量
查看未被使用過的索引
select object_name(object_id), i.name
from sys.indexes i
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 = <dbid> )
order by object_name(object_id) ascsql