it-swarm.dev

Jak określić używane / wolne miejsce w plikach bazy danych SQL?

Zwykle używam następującej metody do określenia wolnego/używanego miejsca w każdym pliku bazy danych:

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

Zwraca całkowitą i wykorzystaną przestrzeń na stronach, którą następnie mnożę przez 8, aby uzyskać KB (lub podzielę przez 128,0, aby uzyskać MB).

Znalazłem inny skrypt niż zamiast tego używa DBCC showfilestats I dbcc sqlperf(logspace), aby zwrócić TotalExtents i UsedExtents, które można następnie pomnożyć przez 64, aby uzyskać KB (lub podzielić przez 16,0, aby uzyskać MB).

Ignorując dodatkowe kolumny, czy te dwa zawsze będą dawały identyczne wartości dla wolnego/całkowitego miejsca? Co z sp_spaceused?

Czy ich dokładność zależy od ostatniej aktualizacji DBCC?

Czy istnieje inna lepsza metoda określania używanej/wolnej przestrzeni? (Potrzebuję tego skryptu do pracy na serwerach SQL 2000, 2005 i 2008)

Częściowo powiązane: czy możesz mieć częściowo przydzielony zakres? (na przykład przydzielono tylko 3 z 8 stron w danym zakresie)

14
BradC

Ten działa dla mnie i wydaje się być spójny w SQL 2000 do 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

Alternatywa (niekompatybilna z SQL Server 200), która dostarcza więcej informacji, sugerowana przez 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