Sql-Server

清除缺失的索引 DMV

  • March 16, 2016

如何清除缺失的索引 DMV,dm_db_missing_index_group_stats例如dm_db_missing_index_groupsdm_db_missing_index_details

我沒有選項重新啟動伺服器或先將其離線然後重新聯機,因為它是生產環境。

不,沒有用於清除missing_indexDMV 的旋鈕。您必須重新啟動服務,或者,如果您想排除特定表,您可以使用過濾器針對 DMV 創建一個視圖。

您可以使用 、 手動清除的唯一 DMVDBCC SQLPERFsys.dm_os_wait_statssys.dm_os_latch_stats

DBCC SQLPERF 
(
     [ LOGSPACE ]
     |
          [ "sys.dm_os_latch_stats" , CLEAR ]
     |
     [ "sys.dm_os_wait_stats" , CLEAR ]
) 
     [WITH NO_INFOMSGS ]

您一次只能清除這些表(或通過重新啟動伺服器)。如果重建索引,請添加索引或刪除從視圖中刪除的表的索引。

因此,通過擴展,如果您在主鍵上創建一個 1 行過濾索引,然後再次刪除該索引,您將刪除該表。DMV 最多保存 500 條記錄,因此您需要創建最多 500 個 1 行索引並刪除它們。

這可能還不錯,但是如果您在使用非常頻繁的系統上執行,那麼您仍然會schema_mod在桌面上鎖定。一種用於創建索引,一種用於刪除索引。這可能會導致阻塞。但是,我指的是每秒訪問數百到數千次的表。如果您沒有看到這種訪問率,或者您的所有表都有一個索引重建視窗,那麼您可以在那時進行更改。

因此,如果您碰巧有一個"test""dbo"架構中命名的表和一個主鍵,"id"那麼下面將為您清除該表:-

create nonclustered index ix_dmv_drop
   on dbo.test( id )
   where id = 1
   with( online = on );
go
drop index ix_dmv_drop on dbo.test;
go

您可以從此模板創建一個簡單的腳本來刪除它們。只需從 DMV 中提取詳細資訊並創建創建和刪除命令。如果您將其連結回類似的東西,dm_db_index_operational_stats您可以獲得粗略的訪問率,從而避免阻塞問題。

引用自:https://dba.stackexchange.com/questions/87571