web-dev-qa-db-fra.com

Comment déterminer l'espace utilisé / libre dans les fichiers de base de données SQL?

J'utilise normalement la méthode suivante pour déterminer l'espace libre/utilisé dans chaque fichier d'une base de données:

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

Cela renvoie l'espace total et utilisé en pages, que je multiplie ensuite par 8 pour obtenir Ko (ou diviser par 128,0 pour obtenir Mo).

J'ai trouvé un autre script qui utilise à la place DBCC showfilestats Et dbcc sqlperf(logspace) pour renvoyer les TotalExtents et UsedExtents, qui peuvent ensuite être multipliés par 64 pour obtenir Ko (ou divisés par 16,0 pour obtenir Mo).

En ignorant les colonnes supplémentaires, ces deux valeurs donneront-elles toujours des valeurs identiques pour l'espace libre/total? Qu'en est-il de sp_spaceused?

Leur précision dépend-elle toutes les deux d'une mise à jour DBCC récente?

Existe-t-il une autre meilleure méthode pour déterminer l'espace utilisé/libre? (J'ai besoin de ce script pour travailler sur les serveurs SQL 2000, 2005 et 2008)

Partiellement lié: pouvez-vous avoir une étendue partiellement allouée? (seulement 3 des 8 pages dans une étendue sont attribuées, par exemple)

14
BradC

Celui-ci fonctionne pour moi et semble cohérent sur SQL 2000 à SQL Server 2012 CTP3:

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

Une alternative (non compatible avec SQL Server 200) qui fournit plus d'informations, suggérée par 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