2009-06-01 72 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 
相關問題