Makale Özeti

Bu yazımızda SQL Server 2005 ile birlikte gelen yeni özelliklerden biri olan Table Partitioning kavramını inceleyeceğiz.

Makale




SQL Server 2005 Table Partitions

SQL Server 2005 ile gelen yeni özelliklerden biri de “table partitioning” oldu. Table partitioning temel olarak bir tabloyu paralel olarak yani kayıtlar bazında parçalayarak farklı lokasyonlara dağıtmak esasına dayanır. Bu kayıtları dağıtırken göz önüne alınması gereken en önemli unsur, işlemi tek bir alana göre yapabiliyor olmamızdır. Örnek senaryo olarak satış kayıtlarını tutan ve her ay için milyonlarca kayıt bulunduran bir tabloyu ele alalım. Bize en çok gerekli olan kayıtlar, geçerli olan en son ayın kayıtları ise, tarih alanına göre partitioning yaparak geçmiş ayların kayıtlarını da farklı lokasyonlara dağıtacağız.Bu işlemin sonunda hem disk I/O’sunu artırmış hem de tabloda daha az veri saklamış olacağız.

Bu anlamda yapılması gereken işlemleri inceleyelim. Öncelikle partition işleminin tanımını yapmalıyız. Hangi tip bir parametre alarak nasıl bir işlem yapılacağını belirtmeliyiz:

CREATE PARTITION FUNCTION EmailPF (nvarchar(30))
AS RANGE RIGHT FOR VALUES ('G', 'N')
GO

Bu yazmış olduğumuz partition function’ı nvarchar(30) tipinde bir tablo alanını parametre olarak aldıktan sonra, o alana girilecek olan verilere için; sağ tarafında G-N aralığındaki kayıtları bulunduracak şekilde bir ayırma işlemi yapar (RIGHT anahtar sözcüğü sayı doğrusunda sağ tarafta kalacak şekilde bir ayırma yapar). Onun da sağında N-Z aralığı kalacağına göre A-G arasındaki kayıtlar bir yerde, G-N arasındaki kayıtlar bir başka yerde ve N-Z arasındaki kayıtlar ise bir başka yerde olacaktır.

İşte bu aralıkların nerelere yazılacağı konusunda partition scheme’ler berlileyici rol oynar. Aşağıdaki scheme kodunda ilgili EmailPF fonksiyonunu temel alarak orada yapılan ayırma işleminin hangi filegroup’lara dağıtılacağı gösterilmiştir.

CREATE PARTITION SCHEME EmailPS
AS PARTITION EmailPF TO (fg1, fg2, fg3)
GO

Son olarak tabloyu ON EmailPS.. yazarak scheme üzerinden yaratmış oluyoruz.

CREATE TABLE Sales.CustomerEmail
(CustID int, Email nvarchar(30))
ON EmailPS (Email)
GO

Aşağıdaki kod bütünü , yukarıda 3 aşamada anlatılan işlemin öncesi ve sonrasını da ele alır.

/**
Bu bloktaki kodlar AdventureWorks veritabanına 3 adet filegroup ekler.
**/


USE AdventureWorks
GO
ALTER DATABASE AdventureWorks ADD FILEGROUP fg1
ALTER DATABASE AdventureWorks ADD FILEGROUP fg2
ALTER DATABASE AdventureWorks ADD FILEGROUP fg3
GO

/**
Bu bölümde yukarıda tanımı yapılan filegroup’ların hangi fiziksel lokasyonda bulunacakları ve boyut/genişleme bilgileri yer almaktadır.
**/

ALTER DATABASE AdventureWorks
ADD FILE
( NAME = data1,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AWd1.ndf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 1MB)
TO FILEGROUP fg1

ALTER DATABASE AdventureWorks
ADD FILE
( NAME = data2,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AWd2.ndf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 1MB)
TO FILEGROUP fg2

ALTER DATABASE AdventureWorks
ADD FILE
( NAME = data3,
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AWd3.ndf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 1MB)
TO FILEGROUP fg3
GO

/**
Daha önce anlatılan partition function,scheme ve table yaratma işlemleri görüntülenmektedir.
**/

CREATE PARTITION FUNCTION EmailPF (nvarchar(30))
AS RANGE RIGHT FOR VALUES ('G', 'N')
GO

CREATE PARTITION SCHEME EmailPS
AS PARTITION EmailPF TO (fg1, fg2, fg3)
GO

CREATE TABLE Sales.CustomerEmail
(CustID int, Email nvarchar(30))
ON EmailPS (Email)
GO

/**
Sales.CustomerEmail tablosuna örnek veri girişi yapıyoruz.
**/
INSERT Sales.CustomerEmail
VALUES
(1, 'andrew@adventure-works.com')

INSERT Sales.CustomerEmail
VALUES
(1, 'garth@adventure-works.com')

INSERT Sales.CustomerEmail
VALUES
(1, 'sharon@adventure-works.com')

/**
Herhangibir client Sales.CustomerEmail tablosundan Email alanına ait kayıtları listelediğinde partition bilgisine bakmaksızın tüm kayıtlar listelenecektir.
**/
SELECT Email
FROM Sales.CustomerEmail

/**
Burada ayrıca bu kayıtların partition bilgileri de listelenecektir. Eklediğimiz kayıtlar sırasıyla 1,2 ve 3 nolu partition’larda bulunmaktadır.
**/

-- Retrieve partition information
SELECT Email, $partition.EmailPF(Email) Partition
FROM Sales.CustomerEmail

/**
Son olarak yarattığımız tablo, function,scheme ve filegroup’ları kaldırabiliriz.
**/

DROP TABLE Sales.CustomerEmail
GO
DROP PARTITION SCHEME EmailPS
DROP PARTITION FUNCTION EmailPF
GO
ALTER DATABASE AdventureWorks REMOVE FILE data1
ALTER DATABASE AdventureWorks REMOVE FILE data2
ALTER DATABASE AdventureWorks REMOVE FILE data3
ALTER DATABASE AdventureWorks REMOVE FILEGROUP fg1
ALTER DATABASE AdventureWorks REMOVE FILEGROUP fg2
ALTER DATABASE AdventureWorks REMOVE FILEGROUP fg3



Onur Kulabaş
Yazılım Danışmanı


Sorularınız için onur.kulabas@bilgeadam.com