2011-08-13 85 views
1

系統函數sys.dm_db_index_physical_stats返回服務器上所有索引的碎片。它將返回表和索引的id而不是名稱。數據庫名稱,架構的和對象可使用db_nameobject_schema_nameobject_name發現:將index_id翻譯爲索引名稱

select db_name(ips.database_id) 
,  object_schema_name(ips.object_id, ips.database_id) 
,  object_name(ips.object_id, ips.database_id) 
,  ips.index_id 
,  ips.avg_fragmentation_in_percent 
from sys.dm_db_index_physical_stats(null, null, null, null, null) ips 

功能object_name沒有索引的工作。加入sys.indexes的作品,但它是數據庫特定的,所以你必須使用動態SQL在遊標中運行它。

有沒有更好的方法將index_id翻譯成索引的名稱?

回答

0

而不是使用sys.dm_db_index_physical_stats沒有數據庫參數集,爲什麼不循環sys.databases中的數據庫列表拉入臨時表,然後查詢特定數據庫的索引統計信息。有關於此主題的extensive script posted here

+0

+1感謝您的鏈接。我現在像你說的那樣循環着,想知道是否有更好的方法。 – Andomar

+0

雖然這可能是解決問題的有價值的提示,但答案確實需要證明解決方案。請[編輯]提供示例代碼來展示你的意思。或者,可以考慮將其寫爲註釋。 –

-1

系統視圖dm_db_index_physical_stats包含一列object_id。這是sysobjects表中對象(表)的標識。所以你可以簡單地查看它:

SELECT name FROM sys.sysobjects WHERE id = 'add object id here' 

name將是表名。顯然這也可以變成INNER JOIN以防止額外的呼叫。