Sql-Server

如何按文件辨識磁碟空間消耗最高的表?

  • January 4, 2021

是否可以執行查詢來查看文件組中給定文件的磁碟空間消耗最高的表?

需要為給定的 SAN 驅動器釋放一些磁碟空間,並且需要確定哪些表正在為該驅動器上的幾個數據文件使用最多的空間。

棘手的部分是獲取每個文件和對象的資訊。添加文件的分佈可能不相等的事實。即,傳統的 DMV 不會有用。

但是,如果您破解 IAM 頁面怎麼辦?這將為每個對象告訴您該對象使用哪些頁面,以及該頁面位於哪個文件上。即,只需在 WHERE 子句中指定您感興趣的文件(或將文件添加到 GROUP BY,這取決於您想要什麼),並且 Bob 是您的叔叔!

這是我拼湊起來的東西,它似乎可以解決問題。首先嘗試使用較小的數據庫,可能需要一段時間才能破解所有對象的所有 IAM。

(您可以通過使用游標並僅遍歷您感興趣的對象(object_id 是第二個參數)來使其變得花哨,但是由於無論如何您都在追求最大的表,我懷疑您會發現這是值得的。)

SELECT OBJECT_NAME(a.object_id), COUNT_BIG(*) * 8192/(1024*1024) AS size_MB
FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, null, null, 'LIMITED') AS a
WHERE a.extent_file_id = 1
GROUP BY OBJECT_NAME(a.object_id)
ORDER BY size_MB DESC

我建議您也可以在沒有多個文件的數據庫中對其進行測試,以驗證這似乎是正確的。我的測試給了我正確的資訊,但這些測試並不詳盡。然而,它們確實包括 LOB 頁面和列儲存索引(最終是 LOB 頁面)。

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