MSSQL Server FileGroup and Data File Commands

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

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir