2011-02-28 71 views

回答

4

看看sys.dm_db_index_usage_stats DMV。请注意,每次SQL Server重新启动时都会重置这些计数器。

+7

还要记住,索引可能很少使用,但是当他们运行每年的废话时,您可能会有会计部门在线。 – Sam 2011-02-28 17:44:36

7

基于Joe的答案,我想出了这一点:

SELECT 
     row_number() over(order by user_seeks,user_lookups,user_scans), 
     [Database] = d.name, 
     [Schema]= s.name, 
     [Table]= o.name, 
     [Index]= x.name, 
     [Scans] = user_scans, 
     [Seeks] = user_seeks, 
     [Lookups] = user_lookups, 
     [Last Scan] = last_user_scan, 
     [System Scans] = system_scans 
FROM sys.dm_db_index_usage_stats u 
INNER JOIN sys.sysdatabases d on u.database_id = d.dbid 
INNER JOIN sys.sysindexes x on u.object_id = x.id and u.index_id = x.indid 
INNER JOIN sys.objects o on u.object_id = o.object_id 
INNER JOIN sys.schemas s on s.schema_id = o.schema_id 
where x.name is not null 
order by 1 desc 
0

退房的this articlethis section由Ian Stirk在2007年非常漂亮的工具集,包括找到你的未使用的索引。

0

检查用户查询索引是否随着表中的每个选择而增加,除非服务器重新启动,这会让您清楚地了解正在使用或不使用索引。

SELECT DISTINCT OBJECT_NAME(sis.OBJECT_ID) TableName, si.name AS IndexName, sc.Name AS ColumnName, 
sic.Index_ID, sis.user_seeks, sis.user_scans, sis.user_lookups, sis.user_updates 
FROM sys.dm_db_index_usage_stats sis 
INNER JOIN sys.indexes si ON sis.OBJECT_ID = si.OBJECT_ID AND sis.Index_ID = si.Index_ID 
INNER JOIN sys.index_columns sic ON sis.OBJECT_ID = sic.OBJECT_ID AND sic.Index_ID = si.Index_ID 
INNER JOIN sys.columns sc ON sis.OBJECT_ID = sc.OBJECT_ID AND sic.Column_ID = sc.Column_ID 
WHERE sis.Database_ID = DB_ID('database_name') AND sis.OBJECT_ID = OBJECT_ID('table_name'); 
GO 
相关问题