Normalde bir veritabanının her bir dosyasındaki boş/kullanılan alanı belirlemek için aşağıdaki yöntemi kullanırım:
Select *, fileproperty(name, 'SpaceUsed') as Used
From dbo.sysfiles
Bu, sayfa cinsinden toplam ve kullanılan alanı döndürür, daha sonra KB elde etmek için 8 ile çarparım (veya MB elde etmek için 128.0'a bölerim).
Bunun yerine TotalExtents ve UsedExtents değerlerini döndürmek için DBCC showfilestats
ve dbcc sqlperf(logspace)
kullanan başka bir komut dosyası buldum, bunlar daha sonra KB elde etmek için 64 ile çarpılabilir (veya MB elde etmek için 16.0'a bölünebilir).
Ekstra sütunları göz ardı edersek, bu ikisi boş/toplam alan için her zaman aynı değerleri mi verir? Peki ya sp_spaceused
?
Her ikisinin de doğruluğu yakın tarihli bir DBCC UPDATEUSAGE'a mı bağlıdır?
Kullanılan/boş alanı belirlemek için başka, daha iyi bir yöntem var mı? (Bu betiğin SQL 2000, 2005 ve 2008 sunucularında çalışmasına ihtiyacım var)
Kısmen ilgili: Kısmen ayrılmış bir kapsamınız olabilir mi? (örneğin, bir kapsam içindeki 8 sayfadan yalnızca 3'ü ayrılmıştır)
Bu benim için çalışıyor ve SQL 2000'den SQL Server 2012 CTP3'e kadar tutarlı görünüyor:
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
Tri Effendi SS]1 tarafından önerilen daha fazla bilgi sağlayan bir alternatif (SQL Server 200 ile uyumlu değildir):
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;