Yukarıdaki şekli kısaca açıklamak gerekirse satışlar tablosu bütün bir parça gibi görünüp sorgulansa bile eklenen her yeni kayıt bölge ID bilgisine göre farklı bir fiziksel data dosyasına yazılacaktır. Bu data dosyaları biz yeni bir veri tabanı oluştururken otomatik oluşan meta data file (mdf) içerebileceği gibi ikinci data dosyaları diye adlandırılan ndf dosyalarını da içerebilir.
Örneğe geçmeden önce Partitioning işleminin adımlarına kısaca göz atalım:
1- Partitioning işleminin uygulanacağı tablodaki key alanları ve partition sayısı belirlenir.
2- Filegrouplar oluşturulur.
3- Partition fonksiyonu yazılır.
4- Partition şeması oluşturulur.
5- Son olarak da oluşturulan bu şema üzerinde Partitioned Tablo oluşturulur.
Örnek Senaryo: Türkiye geneli satışlarımız tbl_Satis isimli tabloda satişin yapıldığı bölge ID sine göre bölümlendirilmiş bir şekilde tutacağız.
İlk olarak tabloda bulunan int tipindeki BolgeID kolonunu partition olarak seçtim.
Daha sonra bunu uygun olarak 7 farklı bölge olduğu için oluşturulan Filegroupa 7 bölge olduğu için 7 tane data dosyası hazırlamam gerekecek. Bunun için:
Alter Database <DatabaseAdı> Add FileGroup <FileGrupAdı>
Komutu ile önce filegroup oluşturulur daha sonra bu filegroupa data dosyaları eklenir.
Alter Database <DatabaseAdı>
Add File (Name=N’BirinciBolgeDataDosya’,
FileName=N’C:\BirinciBolgeDataDosya.ndf’,Size=2GB)
To FileGroup <FileGrupAdı>
Bu işlemler yapıldıktan sonra artık Partition fonksiyonumuzu yazabiliriz. Partition fonksiyonu bize seçilen bölümleme keyine kaplamış olduğu alana göre hangi kaydın hangi data dosyasına yazılacağını belirtir.
CREATE PARTITION FUNCTION PartFuncBolgeID (INT)
AS RANGE LEFT FOR VALUES (1,2,3,4,5,6)
(INT) ifadesi ile fonksiyonun Partitioning işlemini yapacağı key alanının tipini belirtir.
Range değerinde sonra gelen left veya right ifadesi ise parantez içinde verilen değerlerin nasıl sınırlandırılacağı hakkında bilgi verir. Bizim fonksiyonumuzda:
Partition 1’e BolgeID<=1
Partition 2’ye BolgeID>1 ve BolgeID<=2
Partition 3’e BolgeID>2 ve BolgeID<=3
Partition 4’e BolgeID>3 ve BolgeID<=4
Partition 5’e BolgeID>4 ve BolgeID<=5
Partition 6’ya BolgeID>5 ve BolgeID<=6
Partition 7’ye BolgeID>6 olan kayıtlar eklenecektir.
Partition fonksiyonumuzu da yazdıktan sonra artık üzerinde Partitioned tablomuzu oluşturacağımız Partition şemamızı oluşturabiliriz.
CREATE PARTITION SCHEME PartScheme AS
PARTITION PartFuncBolgeID
ALL TO ([PRIMARY])
PARTITION anahtar değeriyle birlikte daha önceden oluşturduğumuz ve bu şemanın kullanmasını istediğimiz Partition fonksiyonumuzu belirtiyoruz. Ben Şemayı default olan PRIMARY Filegroup üzerinde oluşturdum bunun siz yukarıda verilen şekilde oluşturduğunuz bir filegroupla da değiştirebilirsiniz.
Son olarak Partitioned tablomuzu oluşturmak kaldı. Bunu oluşturmak için yazacağımız T-SQL de çok farklı değil aslında:
CREATE TABLE tbl_Satislar
(
BolgeID INT ,
UrunAd CHAR(800) ,
Adet INT
)
ON
PartScheme (BolgeID)
Önemli Not: Burada partition kolonu seçtiğimizde performans açısından dikkat etmemiz gereken en önemli husus o kolonun sorgudaki koşullarda çok kullanılıyor olmasıdır.
Bu tabloyuda oluşturduktan sonra yapmızı kontrol etmek amacıyla sys.partitions view’ını sorgulayarak tablu üzerinde kaç tane partition olduğunu görebiliriz.
SELECT *
FROM sys.partitions
WHERE OBJECT_ID = OBJECT_ID('tbl_Satislar')
Bu sorgulama sonucu aşağıdaki tabloyu elde ediyoruz. Dikkat edilmesi gereken nokta şuanda Partitioned table’a hiç kayıt birmediğimiz için her partitiondaki kayıt sayısı 0(sıfır) dır.

Şimdi test için bir kaç kayıt girelim:
insert tbl_Satislar values (1,'Kitap',5)
insert tbl_Satislar values (1,'Kitap',5)
insert tbl_Satislar values (6,'Kitap',5)
insert tbl_Satislar values (4,'Kitap',5)
insert tbl_Satislar values (6,'Kitap',5)
insert tbl_Satislar values (2,'Kitap',5)
insert tbl_Satislar values (3,'Kitap',5)
insert tbl_Satislar values (4,'Kitap',5)
Bu kayıtları girdikten sonra son kez partitionlarımızın durumlarına bakalım:

Yukarıda da görüldüğü gibi eklediğim kayıtlar BolgeID ye göre farklı partitionlara kaydedildi.
Partioned tablelar konusu ile ilgili şimdilik bu kadar yeterli olur diye düşünüyorum bir sonraki makalede var sık karşılaşılan partioning sorunları, daha önce oluşturduğumuz tabloları partioned table yapma ve partioned table’larımız genişletme gibi konular üzerinde duracağız.
Konuyla ilgili sorularınız Forum’a yazabilirsiniz.
Az Exception’lı Bol SQL’li günler…
Kolay gelsin