2016-12-06 46 views
1

我發現這個腳本給了你未使用的索引,但是它只能運行在每個數據庫上,它是如何通過所有數據庫運行的在服務器我發現這個腳本只通過當前數據庫並且識別未使用的索引,但是我想要遍歷所有數據庫

SELECT o.name , 
     indexname = i.name , 
     i.index_id , 
     reads = user_seeks + user_scans + user_lookups , 
     writes = user_updates , 
     rows = (SELECT SUM(p.rows) 
       FROM sys.partitions p 
       WHERE p.index_id = s.index_id 
         AND s.object_id = p.object_id 
       ) , 
     CASE WHEN s.user_updates < 1 THEN 100 
      ELSE 1.00 * (s.user_seeks + s.user_scans + s.user_lookups) 
       /s.user_updates 
     END AS reads_per_write , 
     'DROP INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(c.name) + '.' 
     + QUOTENAME(OBJECT_NAME(s.object_id)) AS 'drop statement' 
FROM sys.dm_db_index_usage_stats s 
     INNER JOIN sys.indexes i ON i.index_id = s.index_id 
            AND s.object_id = i.object_id 
     INNER JOIN sys.objects o ON s.object_id = o.object_id 
     INNER JOIN sys.schemas c ON o.schema_id = c.schema_id 
WHERE OBJECTPROPERTY(s.object_id, 'IsUserTable') = 1 
     AND s.database_id = DB_ID() 
     AND i.type_desc = 'nonclustered' 
     AND i.is_primary_key = 0 
     AND i.is_unique_constraint = 0 
     AND (SELECT SUM(p.rows) 
       FROM  sys.partitions p 
       WHERE  p.index_id = s.index_id 
         AND s.object_id = p.object_id 
      ) > 10000 
ORDER BY reads_per_write ASC; 

回答

1

有在你的代碼行被限制記錄到當前數據庫:

AND s.database_id = DB_ID() 

您的where子句。如果你刪除它,它會給你所有的數據庫和你有權訪問的對象的統計數據。

您可能還想包括數據庫名,如果你刪除了這一行:

SELECT 
    db_name(database_id) DATABASE_NAME, 
    ... 
+0

謝謝您的幫助。我的計劃是建立在主數據庫中的作業,我可以通過所有的數據庫 – ALE

+0

我跑卸妝AND s.database_id = DB_ID()如你所建議,但仍然是相同的結果 – ALE

+0

你有權訪問其他數據庫?或者您使用的憑據? –

相關問題