2017-04-26 150 views
0

我想確定在SQL Server數據庫文件中有多少空間可用,使用這個略有修改的查詢版本,我在SO上找到了某處。檢查SQL Server數據庫文件中未使用的空間

SELECT 
    GETDATE() AS [Timestamp], 
    [TYPE] = A.TYPE_DESC, 
    [FILE_Name] = A.name, 
    [FILESIZE_MB] = CONVERT(DECIMAL(10, 2), A.SIZE/128.0), 
    [USEDSPACE_MB] = CONVERT(DECIMAL(10, 2), A.SIZE/128.0 - ((SIZE/128.0) - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)), 
    [FREESPACE_MB] = CONVERT(DECIMAL(10, 2), A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0), 
    [FREESPACE_%] = CONVERT(DECIMAL(10, 2), ((A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)/(A.SIZE/128.0)) * 100), 
    [FILEGROUP_NAME] = fg.name, 
    [File_Location] = A.PHYSICAL_NAME 
FROM 
    sys.database_files A 
LEFT JOIN 
    sys.filegroups fg ON A.data_space_id = fg.data_space_id 
WHERE 
    A.TYPE_DESC NOT LIKE 'LOG' 
ORDER BY 
    A.TYPE desc, A.NAME; 

因爲當數據從數據庫中刪除數據庫文件不縮水,查詢並不完全提供所有我正在尋找的信息。

是否有任何方法可以告知SpaceUsed文件屬性中包含多少實際數據(由於刪除的記錄等可用空間)?或者是唯一的選擇,可以執行諸如DBCC SHRINKDATABASE之類的操作並更改文件的物理大小?

我看過sp_spaceused,sys.dm_db_index_physical_stats,還有其他一些東西,但到目前爲止還沒有找到解決方案。

更新:我發現了一些我認爲更接近我需要的東西,雖然我不確定它是否正確。計算使用的頁面數量/平均頁面空間的使用空間看起來像一個接近我所期望的值。

SELECT 
    page_count, 
    avg_page_space_used_in_percent 
FROM 
    sys.dm_db_index_physical_stats(db_id('TestDB'), NULL, NULL, NULL, 'Detailed') 

回答

0

在SSMS中,嘗試右鍵單擊數據庫,轉到報告,然後選擇標準報告,然後選擇磁盤使用情況。如果這不適合你,也許其他標準報告之一。

enter image description here

下面就以標準盤使用情況報告的餅圖,您可以看到數據文件

enter image description here

+0

感謝您的信息。這基本上是我從查詢中獲得的相同類型的東西,所以它不完全符合我的要求。我不確定我想要的是否可能。 – thephez

1

有幾個方法可以做到這一點,我個人使用的磁盤空間最喜歡的是未記錄的DBCC命令ShowFileStats。它輸出數據庫的數據文件列表,磁盤上的擴展盤區總數以及實際使用的擴展盤區數量。

對於那些不記得的,範圍是8頁,頁面大小是8千字節。所以對這兩個輸出的一個小數學應該給你你正在尋找的信息。這是一個快速示例腳本。

請注意,DBCC命令在當前數據庫的上下文中運行。你可以修改它並將它變成一個小循環。

IF OBJECT_ID('tempdb..#tempDataUsage') IS NOT NULL DROP TABLE #tempDataUsage 
CREATE TABLE #tempDataUsage 
(
    [Fileid] INT, 
    [FileGroup] INT, 
    [TotalExtents] BIGINT, 
    [UsedExtents] BIGINT, 
    [Name] sysname, 
    [FileName] varchar(256) 
) 
DECLARE @SQLStatement NVARCHAR(400) = 'USE msdb 
DBCC ShowFileStats' 
INSERT INTO #tempDataUsage 
EXEC (@SQLStatement) 

SELECT 
    (TotalExtents * 8 * 8) AS totalSpaceOndiskKB, 
    (UsedExtents * 8 * 8) AS SpaceActuallyUsedKB, 
    Name AS DbName, 
    FileName 
FROM 
    #tempDataUsage 
+0

這返回與我使用的查詢基本相同的信息。我用另一種我發現看起來很有前途的方法更新了這個問題。 – thephez

+0

@thephez是的,DMV將工作。抱歉,我沒有收到「實際數據」評論。你可能需要通過Database_Id來獲得真正的總數。它看起來像dmv返回每個對象的結果。如果你只是看每個數據文件,但我仍然喜歡ShowFilestats。 :) – mokszs