it-swarm.com.de

Wie wird der verwendete / freie Speicherplatz in SQL-Datenbankdateien ermittelt?

Normalerweise verwende ich die folgende Methode, um den freien/verwendeten Speicherplatz in jeder Datei einer Datenbank zu bestimmen:

Select *, fileproperty(name, 'SpaceUsed') as Used
From dbo.sysfiles

Dies gibt den gesamten und verwendeten Speicherplatz auf den Seiten zurück, den ich dann mit 8 multipliziere, um KB zu erhalten (oder durch 128,0 dividiere, um MB zu erhalten).

Ich habe ein anderes Skript gefunden, das stattdessen DBCC showfilestats Und dbcc sqlperf(logspace) verwendet, um die TotalExtents und UsedExtents zurückzugeben. Diese können dann mit 64 multipliziert werden, um KB zu erhalten (oder durch 16,0 geteilt werden, um MB zu erhalten).

Wenn Sie die zusätzlichen Spalten ignorieren, geben diese beiden immer identische Werte für den freien/Gesamtspeicherplatz an? Was ist mit sp_spaceused?

Hängt ihre Genauigkeit von einer kürzlich durchgeführten DBCC-Aktualisierung ab?

Gibt es eine andere, bessere Methode zur Bestimmung des genutzten/freien Speicherplatzes? (Ich benötige dieses Skript, um auf SQL 2000-, 2005- und 2008-Servern zu arbeiten.)

Teilweise verwandt: Können Sie einen teilweise zugewiesenen Umfang haben? (Zum Beispiel werden nur 3 der 8 Seiten innerhalb eines Bereichs zugewiesen.)

14
BradC

Dieser funktioniert für mich und scheint unter SQL 2000 bis SQL Server 2012 CTP3 konsistent zu sein:

SELECT RTRIM(name) AS [Segment Name], groupid AS [Group Id], filename AS [File Name],
   CAST(size/128.0 AS DECIMAL(10,2)) AS [Allocated Size in MB],
   CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2)) AS [Space Used in MB],
   CAST([maxsize]/128.0 AS DECIMAL(10,2)) AS [Max in MB],
   CAST(size/128.0-(FILEPROPERTY(name, 'SpaceUsed')/128.0) AS DECIMAL(10,2)) AS [Available Space in MB],
   CAST((CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2))/CAST(size/128.0 AS DECIMAL(10,2)))*100 AS DECIMAL(10,2)) AS [Percent Used]
FROM sysfiles
ORDER BY groupid DESC

Eine Alternative (nicht kompatibel mit SQL Server 200) mit weiteren Informationen, vorgeschlagen von Tri Effendi SS :

USE [database name]
GO
SELECT 
    [TYPE] = A.TYPE_DESC
    ,[FILE_Name] = A.name
    ,[FILEGROUP_NAME] = fg.name
    ,[File_Location] = A.PHYSICAL_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)
    ,[AutoGrow] = 'By ' + CASE is_percent_growth WHEN 0 THEN CAST(growth/128 AS VARCHAR(10)) + ' MB -' 
        WHEN 1 THEN CAST(growth AS VARCHAR(10)) + '% -' ELSE '' END 
        + CASE max_size WHEN 0 THEN 'DISABLED' WHEN -1 THEN ' Unrestricted' 
            ELSE ' Restricted to ' + CAST(max_size/(128*1024) AS VARCHAR(10)) + ' GB' END 
        + CASE is_percent_growth WHEN 1 THEN ' [autogrowth by percent, BAD setting!]' ELSE '' END
FROM sys.database_files A LEFT JOIN sys.filegroups fg ON A.data_space_id = fg.data_space_id 
order by A.TYPE desc, A.NAME; 
39
Bruce