Bu makalede filegroup ve data file komutlarını görmüş olacağız. Şimdi bu komutların neler olduğunu görelim.
1.Veritabanı altında filegroup’ları aşağıdaki komutu ile görebiliriz.
SELECT
fg.name AS FilegroupName,
fg.data_space_id,
fg.is_default,
fg.is_read_only,
fg.type_desc,
mf.name AS DataFileLogicalName,
mf.physical_name AS DataFilePath,
mf.size * 8 / 1024 AS SizeMB,
mf.max_size,
mf.growth * CASE WHEN mf.is_percent_growth = 1 THEN 1 ELSE 8 END / 1024 AS GrowthValue,
CASE mf.is_percent_growth
WHEN 1 THEN 'Percent'
ELSE 'MB'
END AS GrowthType
FROM
sys.filegroups fg
INNER JOIN sys.master_files mf
ON fg.data_space_id = mf.data_space_id
WHERE
mf.type_desc = 'ROWS' -- Sadece veri dosyaları (log dosyaları hariç)
AND mf.database_id = DB_ID() -- Geçerli veritabanı
ORDER BY
fg.name, mf.name;

2.SQL Server’da hangi tablo ve indeksin hangi filegroup altında olduğunu bulmak için aşağıdaki gibi bir T-SQL sorgusu kullanabilirsin. Bu script hem tabloları hem de onlara ait indeksleri (primary key, clustered, nonclustered vb.) ve bulundukları filegroup’ları gösterir.
SELECT
sch.name AS SchemaName,
obj.name AS TableName,
idx.name AS IndexName,
idx.type_desc AS IndexType,
fg.name AS FileGroupName
FROM
sys.indexes idx
INNER JOIN sys.objects obj ON idx.object_id = obj.object_id
INNER JOIN sys.schemas sch ON obj.schema_id = sch.schema_id
INNER JOIN sys.data_spaces ds ON idx.data_space_id = ds.data_space_id
LEFT JOIN sys.filegroups fg ON ds.data_space_id = fg.data_space_id
WHERE
obj.type = 'U' -- Sadece user tabloları
ORDER BY
fg.name, sch.name, obj.name;
Not: Partition tablolarda herhangi bir sonuç dönmez. tablo filegroup gelmez. Tablo ilk oluştururken nerede oluşturulmuşsa oluşturulduğu file group görünmektedir.

3. Aşağıdaki komut hangi filegroup altında çalıştırılırsa ilgili filegroup hakkında bilgi vermektedir. Aşağıdaki komutta hangi file group üzerinde inceleme isteniyorsa ilgili file group yazılması gerekmektedir.
-- get filegroup files
DECLARE @FileGroupName sysname = N'FG2024';
;WITH src AS
(
SELECT FG = fg.name,
FileID = f.file_id,
LogicalName = f.name,
[Path] = f.physical_name,
FileSizeMB = f.size/128.0,
UsedSpaceMB = CONVERT(bigint, FILEPROPERTY(f.[name], 'SpaceUsed'))/128.0,
GrowthMB = CASE f.is_percent_growth WHEN 1 THEN NULL ELSE f.growth/128.0 END,
MaxSizeMB = NULLIF(f.max_size, -1)/128.0,
DriveSizeMB = vs.total_bytes/1048576.0,
DriveFreeMB = vs.available_bytes/1048576.0
FROM sys.database_files AS f
INNER JOIN sys.filegroups AS fg
ON f.data_space_id = fg.data_space_id
CROSS APPLY sys.dm_os_volume_stats(DB_ID(), f.file_id) AS vs
WHERE fg.name = COALESCE(@FileGroupName, fg.name)
)
SELECT [Filegroup] = FG, FileID, LogicalName, [Path],
FileSizeMB = CONVERT(decimal(18,2), FileSizeMB),
FreeSpaceMB = CONVERT(decimal(18,2), FileSizeMB-UsedSpaceMB),
[%] = CONVERT(decimal(5,2), 100.0*(FileSizeMB-UsedSpaceMB)/FileSizeMB),
GrowthMB = COALESCE(RTRIM(CONVERT(decimal(18,2), GrowthMB)), '% warning!'),
MaxSizeMB = CONVERT(decimal(18,2), MaxSizeMB),
DriveSizeMB = CONVERT(bigint, DriveSizeMB),
DriveFreeMB = CONVERT(bigint, DriveFreeMB),
[%] = CONVERT(decimal(5,2), 100.0*(DriveFreeMB)/DriveSizeMB)
FROM src
ORDER BY FG, LogicalName;

PRIMARY yerine SECONDARY @Filegroupname kısmına yazılırsa ilgili filegroup hakkında bilgileri görmekteyiz.
4. Aşağıdaki komut İlgili filegroup’un yüzde kaç boş olduğunu hakkında bilgi vermektedir.
SELECT
FILEGROUP_NAME(data_space_id) as FilegroupName,
SUM(size/128.0) AS CurrentSizeMB,
SUM(size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0) AS FreeSpaceMB,
(
SUM(size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0) / -- FreeSpaceMB
(SUM(size/128.0)) -- CurrentSizeMB
* 100 -- Convert to percentage
) AS FilegroupPercentFree,
COUNT(*) as NumberOfFilesInFilegroup
FROM sys.database_files
WHERE data_space_id <> 0
GROUP BY FILEGROUP_NAME(data_space_id);

5.Kodumuzdan önce belirlenen filegroup’un hangi file_id değerine sahip olduğunu görmek için aşağıdaki komut kullanılır.
use DB_NAME
SELECT file_id,type,type_desc,data_space_id,name,physical_name,size FROM sys.database_files

Data dosyasının type’ı 0, log dosyasının type’ı 1’dir. İlgili filegroup’un file_id değeri öğrenilir.
6. Aşağıdaki komut tüm instance altında bulunan veritabanlarındaki filegroupların doluluk oranını göstermektedir.
exec sp_MSforeachdb'
use [?]
SELECT
DB_NAME() AS VeritabaniAdi,
fg.name AS FilegroupName,
SUM(df.size) / 128.0 AS CurrentSizeMB,
SUM(df.size - CAST(FILEPROPERTY(df.name, ''SpaceUsed'' ) AS INT)) / 128.0 AS FreeSpaceMB,
(SUM(df.size - CAST(FILEPROPERTY(df.name, ''SpaceUsed'' ) AS INT)) * 100.0) / SUM(df.size) AS FilegroupPercentFree,
COUNT(*) AS NumberOfFilesInFilegroup
FROM sys.database_files df
INNER JOIN sys.filegroups fg ON df.data_space_id = fg.data_space_id
WHERE df.type_desc = ''ROWS''
GROUP BY fg.name;'
Aşağıdaki komut ile hangi tablonun hangi file group’ta olduğu bulunabilir.
use DATABASE_NAME
go
SELECT OBJECT_NAME(t.object_id) AS [Table Name], d.name AS [Filegroup Name] FROM sys.data_spaces d
JOIN sys.indexes i on i.data_space_id = d.data_space_id
JOIN sys.tables t on t.object_id = i.object_id
WHERE i.index_id<2
AND t.type = 'U'
AND OBJECT_NAME(t.object_id) ='TABLE_NAME'

Bu makalede FileGroup ve Data File komutlarını görmüş olduk. Başka bir makalede görüşmek dileğiyle.
“Onlar, göğün hava boşluğunda ilâhî emre boyun eğmiş bir halde uçuşan kuşlara bakıp hiç düşünmezler mi? Bunları orada tutan Allah’tan başkası değildir. Elbette bunda iman edecek bir toplum için nice deliller, işaretler vardır. .” Nahl-79
