1. Ana Sayfa
  2. SQL Server
  3. SQL Table Partition Nedir? Nasıl Çalışır?

SQL Table Partition Nedir? Nasıl Çalışır?

Table Partition yöntemi en basit anlatımıyla böl, parçala yönet mantığındadır. Büyük miktarda veri içeren tablolarımızda select, update, delete işlemlerinde performans sorunları yaşamaya başladığımızda aklımıza gelen ilk çözümlerden biridir uğraştığımız Data miktarını azaltmak, eski tarihli Data’yı bir arşiv tablosuna alalım deriz.

Teoride güzel, peki pratikte?

Veritabanımız hangi uygulama arkasında ise artık bu uygulamanın eski datalar için farklı bir tabloya gitmesi gerekir. Datalar üzerinden raporlama yapacağımızda bu iki tabloyu tekrar birleştirmemiz de gerekir. Yapılacak herhangi bir DML operasyonunu iki ayrı tabloda çalıştırmak gerekir. Peki, tüm bunlara gerek var mı?

Tek bir tablomuz olsa, güncel Data’mızı daha hızlı olduğunu bildiğimiz diskte, eski datayı nispeten daha düşük performanslı diskte tutsak. İstediğimizde tamamını tek bir seferde sorgulayabilsek. Uygulamamızda herhangi bir kod değişikliği yapmamız gerekmese. Çok şey mi istiyoruz? Hayır. Tek istediğimiz SQL Table Partition kullanmak, hadi başlayalım.

Örnek için AdventureWorks den Sales.SalesOrderDetail tablosunu alalım, tabloda 121317 kayıt var. Tablo üzerinde Partition’ı SQL script le yapabileceğimiz gibi, Management Studio’da bir sihirbaz da mevcut. Sihirbazı kullanalım.


Resim-1

Tablo üzerinde sağ tıklayıp StorageàCreate Partition yolundan sihirbazı açıyoruz.


Resim-2

İlk ekranımızda hangi alan üzerinden Partition yapmak istediğimiz soruluyor. Tarih örneği olması açısından ModifiedDate alanını seçiyorum. Next dediğimde oluşturacağım Partition fonksiyonuna bir isim vermemi istiyor.


Resim-3

Next ile geldiğim yeni ekran, bu Partition için bir şema ismi vermemizi istiyor isim yazıp devam ediyoruz ve filegrouplar üzerinde datayı dağıtabilmek için kriterlerimizi soruyor.


Resim-4

Ben 2007 başından daha eski kayıtları ve daha güncel kayıtları 2 ayrı Partition’a ayırmak istiyorum. Tek bir filegroup kullandığım için ikisini de Primary seçiyorum, farklı bir disk üzerinde farklı database dosyaları oluşturup buradan farklı filegroup seçerek datayı diskler üzerinde de dağıtabilirdim.

Sihirbazı sonlandırıp oluşan script çalıştırıp Partition’ı oluşturabiliriz.

USE [AdventureWorks2008R2]

GO

BEGIN TRANSACTION

CREATE PARTITION FUNCTION [PartFunc](datetime) AS RANGE LEFT FOR VALUES (N’2006-12-31T00:00:00′)

CREATE PARTITION SCHEME [partScheme] AS PARTITION [PartFunc] TO ([PRIMARY], [PRIMARY])

ALTER TABLE [Sales].[SalesOrderDetail] DROP CONSTRAINT [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID]

ALTER TABLE [Sales].[SalesOrderDetail] ADD CONSTRAINT [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY NONCLUSTERED

(

    [SalesOrderID] ASC,

    [SalesOrderDetailID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

CREATE CLUSTERED INDEX [ClusteredIndex_on_partScheme_635308420518848496] ON [Sales].[SalesOrderDetail]

(    [ModifiedDate]

)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [partScheme]([ModifiedDate])

DROP INDEX [ClusteredIndex_on_partScheme_635308420518848496] ON [Sales].[SalesOrderDetail]

COMMIT TRANSACTION

Oluşturulan Script’i inceleyecek olursak bir Partition fonksiyonu oluşturulduğunu, bu fonksiyon üzerinde bir şema oluşturulduğunu son olarak da tablonun Alter edilerek bu şemaya alındığını görebiliriz.

İşlem sonunda Table PropertiesàStorage sekmesine bakarsak tablomuzun 2 Partition’a ayrıldığını göreceğiz.


Resim-5

Table Partitioning ile ilgili yapılabilecek en hızlı örneği yapmış olduk J. Partition için seçilecek alan çok önemli bir kriter, datayı istediğimiz gibi bölmesi ve tabloya erişimlerimizde en çok kullanacağımızı düşündüğümüz alan olması önemli. Birden fazla alan üzerinden Partition yapmak istiyorsak bu direkt olarak mümkün değil. Alternatif bir çözüm olarak hesaplanan alan kullanıyoruz. Tablomuza istediğimiz kriterlere göre hesaplanan bir alan ekleyip Partition’ı bu alan üzerinden yapabiliriz.

Tablonun kaç Partitiona bölüneceği konusunda ise sihirbazdaki satır tahminleri çok yardımcı olacaktır.

SQL versiyonları ilerledikçe table partiting kullanımında da sınırlar gittikçe ortadan kalmaktadır. Oluşturulabilecek Partition sayısı her versiyonda daha da artıyor.

Partition ile birlikte indexler Partition bazında rebuild edilebilmekte, index bakım zamanları minimum seviyelere çekilebilmektedir.

Partitionlı tablolar üzerinde kullanılabileceğimiz bir başka özellik ise Partition Switching’dir. Milyonlarca satırın saniyeler içerisinde bir tablodan diğerine aktarılabildiğini düşünün, evet çok iyi J

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

www.mshowto.org

Yorum Yap

Yazar Hakkında

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunudur. Kariyerine yazılım ile başlamış olup, zaman içerisinde .Net ve Dynamics Axapta üzerinde geliştirmeler yapmıştır. Son yıllarda yoğun olarak, veritabanı teknolojileri, iş zekası ve raporlama sistemleri ile ilgilenmektedir. Eroğlu Holding'de Bilgi Teknolojileri Proje Lideri olarak çalışmaktadır.

Yorum Yap

Yorumlar (1)