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.Aşağıdaki komut ile ilgili veritabanındaki filegroup’ları ve data file’ları görebiliriz.

USE [FILEGROUP] 
go 
SELECT fg.NAME       AS [File Group Name], 
        sdf.NAME      AS [Data File Name], 
        physical_name AS [Data file location], 
        size / 128    AS [File Size in MB] 
FROM   sys.database_files sdf 
        INNER JOIN sys.filegroups fg 
                ON sdf.data_space_id = fg.data_space_id

3.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;

4. Aşağıdaki komut hangi filegroup altında çalıştırılırsa ilgili filegroup hakkında bilgi vermektedir.

-- 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.

5. 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);

 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