2009-06-01 39 views
0

我写了一个查询,寻找未在生产环境,以删除它们使用的索引,但我很好奇的last_user_update列是否表明该指数完全属于一个维护开销,在这种情况下,最好放弃它,或者索引是否有助于插入/更新/删除语句的执行,在这种情况下,我不想放弃它。以下是我想要使用的查询:MSSQL:last_user_update是否意味着索引损害了性能?

DECLARE @DBInfo TABLE 
(database_id int, object_id int, tablename nvarchar(200), indexname nvarchar(200), lastactivity datetime) 

DECLARE @command VARCHAR(5000) 

SELECT @command = 'Use [' + '?' + '] SELECT 
database_id, o.object_id, o.name, i.name as indexname, max(lastactivity) as lastactivity 
from (
    select database_id, object_id, index_id, max(last_user_seek) as lastactivity from sys.dm_db_index_usage_stats 
    WHERE object_id > 1000 
    GROUP BY database_id, object_id, index_id 
    UNION ALL 
    select database_id, object_id, index_id, max(last_user_scan) as lastactivity from sys.dm_db_index_usage_stats 
    WHERE object_id > 1000 
    GROUP BY database_id, object_id, index_id 
    UNION ALL 
    select database_id, object_id, index_id, max(last_user_lookup) as lastactivity from sys.dm_db_index_usage_stats 
    WHERE object_id > 1000 
    GROUP BY database_id, object_id, index_id 
    /*UNION ALL 
    select database_id, object_id, index_id, max(last_user_update) as lastactivity from sys.dm_db_index_usage_stats 
    WHERE object_id > 1000 
    GROUP BY database_id, object_id, index_id*/ 
) a 
inner join sys.objects o on a.object_id = o.object_id 
inner join sys.indexes i on i.object_id = a.object_id AND i.index_id = a.index_id 
where database_id = db_id() 
GROUP BY database_id, o.object_id, o.name, i.name 
order by lastactivity' 
INSERT INTO @DBInfo 
    (database_id, object_id, tablename, indexname, lastactivity) 
EXEC sp_MSForEachDB @command 

SELECT db_name(database_id) as dbname, tablename, indexname, lastactivity FROM @DBInfo 
where lastactivity < dateadd(day, -15, getdate()) or lastactivity is null 
order by db_name(database_id), tablename, indexname 

回答

2

该列在检查未使用的索引时没有任何实际意义。

该指数可能近期没有更新,但可能还是非常有用的(例如,为了避免表扫描或覆盖流行的查询)。此查询告诉你的指数是如何使用:

SELECT 
    o.name AS [object_name], 
    i.name AS index_name, 
    i.type_desc, 
    u.user_seeks, u.user_scans, 
    u.user_lookups, u.user_updates, 
    o.type 
FROM 
    sys.indexes i 
    JOIN 
    sys.objects o ON i.[object_id] = o.[object_id] 
    LEFT JOIN 
    sys.dm_db_index_usage_stats u ON i.[object_id] = u.[object_id] AND 
            i.index_id = u.index_id AND 
            u.database_id = DB_ID() 
WHERE 
    o.type IN ('U', 'V') AND 
    i.name IS NOT NULL 
ORDER BY 
    o.name, i.NAME; 

编辑,注释后:

我喜欢user_seeks, user_scans, user_lookups and user_updates列,告诉我该指数是如何使用的。仅供参考,我使用的查询上述并列入“system_updates”列,但我得到了零的所有值(SQL 2005,50GB左右的数据库,在这里我们使用这之前效果好)

sys.dm_db_index_usage_stats

user_updates计数器指示在索引 上的 级别的维护级别由于在基础表或 视图上插入,更新或删除 操作而引起。您可以使用此视图 确定哪些指标是由你的应用程序只用轻轻 。您可以 也使用视图来确定哪些 索引招致维护 开销。你可能要考虑 这招致 维护开销,但对于查询不使用 ,或者只是偶尔 用于查询删除索引。

所以,最后一句暗示一下使用以及更新

+0

感谢您的评论。我想象user_updates列引发了同样的问题:它是坏的还是好的? user_updates是否有助于数据修改的执行或伤害它? – 2009-06-01 10:38:49

1

如果你有兴趣指数的动态性能 - 无论他们正在使用或不使用 - 你可能会更好在DMV询问 - Dynamic Management Views。他们应该为您提供有关正在使用哪些索引和多久的好消息。

此外,还有实际使用的查询优化器的内部统计数据表明一)可能丢失索引,可以帮助提高你的服务表现,和b)另外一个显示潜在的未使用的索引一个DMV。

提醒你 - 这些都是动态管理的意见 - 他们可以享有每次重新启动服务器复位,所以他们没有收集过永恒的时间段的数据 - 仅自上次复位。

马克

寻找失踪指数:

SELECT 
    object_name(object_id), d.*, s.* 
FROM 
    sys.dm_db_missing_index_details d 
INNER JOIN 
    sys.dm_db_missing_index_groups g ON d.index_handle = g.index_handle 
INNER JOIN 
    sys.dm_db_missing_index_group_stats s ON g.index_group_handle = s.group_handle 
WHERE 
    database_id = db_id() 
ORDER BY 
    object_id 

查找未使用的索引:

DECLARE @dbid INT 

SELECT @dbid = DB_ID(DB_NAME()) 

SELECT 
    OBJECTNAME = OBJECT_NAME(I.OBJECT_ID), 
    INDEXNAME = I.NAME, 
    I.INDEX_ID 
FROM  
    SYS.INDEXES I 
JOIN 
    SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID 
WHERE  
    OBJECTPROPERTY(O.OBJECT_ID, 'IsUserTable') = 1 
    AND 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 
    OBJECTNAME, 
    I.INDEX_ID, 
    INDEXNAME ASC 
相关问题