it-swarm.asia

Bagaimana menentukan ruang kosong / bekas dalam file database SQL?

Saya biasanya menggunakan metode berikut untuk menentukan ruang kosong/bekas dalam setiap file database:

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

Ini mengembalikan total dan menggunakan ruang di halaman, yang kemudian saya kalikan dengan 8 untuk mendapatkan KB (atau bagi dengan 128.0 untuk mendapatkan MB).

Saya menemukan skrip lain daripada menggunakan DBCC showfilestats Dan dbcc sqlperf(logspace) untuk mengembalikan TotalExtents dan UsedExtents, yang kemudian dapat dikalikan dengan 64 untuk mendapatkan KB (atau dibagi dengan 16,0 untuk mendapatkan MB).

Mengabaikan kolom tambahan, apakah keduanya akan selalu memberikan nilai identik untuk ruang kosong/total? Bagaimana dengan sp_spaceused?

Apakah keakuratan keduanya bergantung pada UPDATEUSAGE DBCC baru-baru ini?

Apakah ada metode lain yang lebih baik untuk menentukan ruang yang digunakan/kosong? (Saya membutuhkan skrip ini untuk bekerja pada server SQL 2000, 2005, dan 2008)

Terkait sebagian: Bisakah Anda memiliki sebagian yang dialokasikan? (misalnya, hanya 3 dari 8 halaman yang dialokasikan,)

14
BradC

Yang ini berfungsi untuk saya dan tampaknya konsisten pada SQL 2000 ke 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

Alternatif (tidak kompatibel dengan SQL Server 200) yang menyediakan informasi lebih lanjut, disarankan oleh 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