ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

SQL Server Partitioned(Bölünmüş) Tablolar

İsmail ADAR
SQL
24.05.2010 12:25:45
Hit : 8286

 SQL Server da Partitioned(Bölünmüş) Table
Boyut olarak çok büyük olan veri tabanlarında bulunan (VLDB-Very Large Database) çok fazla kayıt içeren tabloların daha etkin depolanması ve sorgulanması için geliştirilmiş bir mimaridir. Bu mimari SQL Server 2005 ve üzeri versiyonlarında Enterprise veya Developer lisansı ile kullanılabilmektedir. Buna rağmen SQL Server 2005 öncesi yapılarda bu mimariye duyulan gereksinim kullanıcılar tarafından tanımlanan Partitioned Views ile giderilmeye çalışılmıştır.
SQL Server da genel olarak Partitioned table yapısı iki farklı şekilde tasarlanabilir.
1- Horizontal Partition: Bölümlendirilmesi düşünülen tabloya eklenecek yeni kayıtların belli koşullara göre farklı veri dosyalarına yazıldığı mimaridir.
2- Vertical Partition : Horizontal Partition mimarisinin tersi olarak kolon sayısı çok fazla olduğu tablolarda Partitioning işleminin kolonları göre yapıldığı mimaridir.
Bu makalenin de konusu olan Horizontal Partitioning; tabloya yeni bir kayıt eklenmesi esnasında bizim daha önceden belirlediğimiz bir koşula göre o kaydı yine bizim belirlediğimiz data dosyasına yazılmasıdır.
Örneğin Türkiye genelinde satış yapan bir firmanın Satış tablosundaki kayıtları satışın yapılmış olduğu bölgeID sine göre farklı data dosyalarında tutabilirsin. Böylece tüm satışlarınıza aynı tablodan erişiliyor olmasına rağmen kayıtlar fiziksel olarak farklı veri dosyalarında tutulur. Ya da yine aynı satış tablosunu tarih aralığına göre yıllara hatta aylara göre bölümlendirebiliriz.

 

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

 




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR