Bu makalede MSSQL Server’da Partition Tablo’ya Yeni Bir Function ve Scheme Ekleme konusunu detaylı bir şekilde görmüş olacağız. Bazen partition yapılmış bir tabloya partition yapısını bozulmaması için yeni bir file group eklenme gereği duyulabilir. Bunun için elimizde bulunan partition scheme ve partition function yapısının düzenlenmesi gerekmektedir.
Neden split işlemi yapılır. Yapılmazsa ne olur. Bu konulara detaylı bir şekilde değinelim. Partition yapılarında partition scheme içinde tanımlanan filegroup sayısının, function value (bölümleme aralık) sayısından bir fazla olması gerekiyor. Bu gerçekten SQL Server’da partition mantığının temel kurallarından biridir. Kuralımız bu şekildedir. n değer → n+1 partition → n+1 filegroup
Son Partition Tehlikesi
- Son Partition için tarih aralığı (Tarih>=2025.01.01) sınırı açık uçludur.
- Eğer veri buraya giriyorsa ve sen SPLIT yapıp yeni aralık eklemiyorsan, tüm yeni yıllar bu tek partition’da birikir. Bu makalede Split işlemiyle yeni function ve scheme ekleme işlemini görmüş olacağız.
- Bu da:
- Partition elimine etmeyi zorlaştırır
- Tek partition’da veri şişer
- Bakım ve performans açısından sıkıntı çıkarır.
Son partition’a henüz veri gelmeden SPLIT işlemiyle bir sonraki yılı açılması gerekmektedir. SQL Agent Job ile ay başlarında otomatik olarak bir yıl sonrasını SPLIT eden script yazılabilir (çok yaygın bir çözümdür).
Split işlemi yapılmazsa son partition yapımıza veriler geldiğinde ne olur. Eski yıllar kendi partition’larında kaldığı için performans anlamında hâlâ hızlı çalışır. Ama yeni veriler, sen partition bölmezsen, tek yerde birikir. Bu yüzden o yeni tarihli sorgular yavaşlar.
Son partition scheme üzerinde verilerimiz birikmişse yeni bir function ve scheme split edilir. Daha sonra verilerin biriktiği son partitiondaki veriler yeni partition üzerine taşınması gerekmektedir. Bu zahmetli ve karmaşık bir işlemdir. Yanlış bir aktarım yapılması veri bütünlüğünü tamamen bozmaktadır.
Bir veritabanı altındaki partition yapılmış tabloyu aşağıdaki komut ile görebiliriz.
use [PartSamp]
SELECT
OBJECT_NAME(si.object_id) AS object_name
,pf.NAME AS pf_name
,ps.NAME AS partition_scheme_name
,p.partition_number
,ds.NAME AS partition_filegroup
,rv.value AS range_value
,(
CASE pf.boundary_value_on_right
WHEN 0
THEN 'RAGE_LEFT'
ELSE 'RANGE_RIGHT'
END
) AS range_direction
,SUM(CASE
WHEN si.index_id IN (
1
,0
)
THEN p.rows
ELSE 0
END) AS num_rows
FROM sys.destination_data_spaces AS dds
INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id
LEFT JOIN sys.partition_range_values AS rv ON pf.function_id = rv.function_id
AND dds.destination_id = CASE pf.boundary_value_on_right
WHEN 0
THEN rv.boundary_id
ELSE rv.boundary_id + 1
END
LEFT JOIN sys.indexes AS si ON dds.partition_scheme_id = si.data_space_id
LEFT JOIN sys.partitions AS p ON si.object_id = p.object_id
AND si.index_id = p.index_id
AND dds.destination_id = p.partition_number
LEFT JOIN sys.dm_db_partition_stats AS dbps ON p.object_id = dbps.object_id
AND p.partition_id= dbps.partition_id
WHERE si.object_id = OBJECT_ID('[ŞEMA_ADI].[TABLO_ADI]')
GROUP BY ds.NAME
,p.partition_number
,pf.NAME
,pf.type_desc
,pf.fanout
,pf.boundary_value_on_right
,ps.NAME
,si.object_id
,rv.value
ORDER BY p.partition_number
Sorgumuzu çalıştırdığımızda tablomuzun partition yapısını görebiliriz.

FG2027 partition filegroup eklemek için ilk başta veritabanımızın altında ilgili yıla ait filegroup ve data file oluşturmamız gerekmektedir.
USE PartSamp
ALTER DATABASE [PartSamp] ADD FILEGROUP [FG2027]
Go
ALTER DATABASE [PartSamp] ADD FILE ( NAME = N'FG2027', FILENAME = N'H:\PartSamp\PartSamp_2027.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [FG2027]
Go
Filegroup ve data file oluşturduktan sonra şimdi ise bu filegroup’u partition yapıya dahil etme.
İlk başta ilgili veritabanımızın altındaki storage bölümünde scheme ve function bilgilerimize ve tarih aralığına bakıyoruz.

Aşağıdaki komut ile scheme ve function’ımızı ekleme adımlarına geçiyoruz.
USE PartSamp
ALTER PARTITION SCHEME [ps_tarih2]
NEXT USED [FG2027]
GO
ALTER PARTITION FUNCTION [pf_tarih2]()
SPLIT RANGE (N'2027-01-01T00:00:00.000')
Yeni bir function ve scheme ekleme işlemlerini yaptıktan sonra tablomuzu tekrardan kontrol edelim.

Yukarıdaki resimde de görüldüğü gibi partition filegroup yapısının başarılı bir şekilde eklendiğini görmüş oluyoruz.
Farklı bir örnek üzerinden hatalı bir işlem yapıp kafamıza tam anlamıyla split yapısını oluşturmuş olalım. Örneğimizde partition yapımızda bulunan son file group’a veri ekleyelim. partition yapımızın n+1 kuralını ihlal edelim.

Yukarıdaki yapımıza split yöntemi le yeni bir function ve scheme aralığı ekleyelim.

Daha sonra 2023 yılına ait veri girelim bakalım hangi FG üzerine alınmış olacak.

2023 yılına ait girmiş olduğum veriler ilgili partition yapımıza kaydedilmiş oldu. Bu yapıda gösteriyor ki partition yapımız bozulmuşsa bile split yöntemiyle yeni function ve scheme eklendikten sonra partition yapımız devam etmektedir. Sadece birden fazla yapıda olan partition FG içerisindeki veriler büyük bir özenle yeni partition file group’a eklenmesi gerekmektedir.
Bir sonraki makalede görüşmek dileğiyle..
“Göklerde ve yerde ne varsa hepsinin mülkiyeti Allah’a aittir. İçinizdekini açığa vursanız da gizleseniz de Allah sizi ondan hesaba çeker. Sonra dilediğini bağışlar, dilediğine azap eder; Allah her şeye kādirdir. “Bakara-284
1 thought on “MSSQL Server’da Partition Tablo’ya Yeni Bir Function ve Scheme Ekleme”