Bu makalede partition left function kullanarak tablolarımızı partitionlı olarak create ederek verilerimizi bu şekilde dizayn etme adımlarını göreceğiz.
Öncelikle partition açıklayalım; SQL Server ‘da, büyük tabloların performansını ve yönetilebilirliğini artırmak için tabloyu farklı bölümlere (partitions) ayırabilirsiniz. Bu bölümler genellikle bir tarih sütunu, Id sütunu veya başka bir ayırt edici anahtar temel alınarak yapılır. Partition, sorgu performansını artırabilir çünkü belirli bir veri kümesini sorgularken yalnızca ilgili bölüme erişilir veya ihtiyaç dahilinde sorgularını ilgili partition yönlendirerek sorgu maliyetini ciddi ölçüde azaltabilirsiniz ve bu da SQL engine daha az veri üzerinde çalışmasını sağlar. Ayrıca, veri yönetimi ve bakım görevlerini kolaylaştırır, çünkü eski verileri daha kolay arşivleyebilir veya silebilirsiniz.
Şimdi de partition avantaj ve dezavantajlarına göz atalım;
Partition Tablo Avantajları:
- Partition tablolar, belirli partition üzerinde işlem yaparak sorgu performansını artırabilir.
- Büyük veri kümelerini daha küçük ve yönetilebilir parçalara ayırarak veri yönetimi kolaylaştırılır.
- Veri bakımı ve yedekleme işlemleri daha hızlı ve etkili olabilir.
Partition Tablo Dezavantajları:
- Partition tablolar, işlemleri ve yapılandırmaları, veri tabanı yöneticileri için ek karmaşıklık katabilir.
- Yanlış yapılandırılmış bölümlendirme, veri tabanı performansını olumsuz etkileyebilir.
- Bölümlerin yönetimi ve bakımı ek iş yükü getirebilir.
Peki hep söylenen “left partition” ve “right partition” nedir aralarında ne gibi bir fark vardır şimdi kısaca bunu açıklamaya çalışalım;
- Left Partition: Eğer veriler, belirli bir anahtar değerinden yani bu yukarıda bahsettiğimiz tarih sütunu gibi veya Id sütunu gibi olabilir “küçük (<) veya eşit (=)” koşulları olanları içeren bir bölümde saklanıyorsa, bu “left partition” olarak adlandırılabilir.
- Right Partition: Eğer veriler, belirli bir anahtar değerinden yine yani bu yukarıda bahsettiğimiz tarih sütunu gibi veya Id sütunu gibi olabilir “büyük (>)”koşulu olanları içeren bir bölümde saklanıyorsa, bu “right partition” olarak adlandırılabilir.
Şimdi Elimizdeki veri setlerinden yıllık bir tablo oluşturacağımız ve bu tabloyu da aylık olarak partition yapacağımız bir tasarım gerçekleştireceğimizi düşünelim, range left şeklinde bir tasarım da yapmamız gereken işlemler;
- Filegroup oluşturmak (mevcut bir Filegroup varsa ve eğer oraya eklemek istiyorsak onu da kullanabiliriz.)
- Oluşturmuş olduğumuz Filegroup içerisine file eklemek (bir önceki adımda belirttiğimiz gibi eğer mevcutta Filegroup ve file yapınız var ise siz onunla da devam edebilirsiniz yeni oluşturmak zorunda değilsiniz.)
- Partition Function oluşturmak
- Partition scheme oluşturmak
- Partition tablo oluşturmak
Partition şeklinde oluşturacağımız tablolar için adım adım bu şekilde olacak şimdi başlayalım.
1.Adımda bahsettiğimiz Filegroup oluşturma aşaması için 2015 ve 2016 yılları için Filegroup oluşturuyorum.
Görsel-1
İlgili Filegroup oluşturmak için script;
use [AdventureWorks2019] ALTER DATABASE [AdventureWorks2019] ADD FILEGROUP [FGAdventureWorks2019_2015] use [AdventureWorks2019] ALTER DATABASE [AdventureWorks2019] ADD FILEGROUP [FGAdventureWorks2019_2016]
2.Adımda oluşturmuş olduğumuz filegroup içerisine file ekleme işlemini gerçekleştiriyorum.
Görsel-2
İlgili filegroup içerisine file ekleme işlemini için script;
USE [master] GO ALTER DATABASE [AdventureWorks2019] ADD FILE ( NAME = N'AdventureWorks2019_2015', FILENAME = N'D:\Data1\Data\AdventureWorks2019_2015.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [FGAdventureWorks2019_2015] GO ALTER DATABASE [AdventureWorks2019] ADD FILE ( NAME = N'AdventureWorks2019_2016', FILENAME = N'D:\Data1\Data\AdventureWorks2019_2016.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [FGAdventureWorks2019_2016] GO
3.Adımda bahsettiğimiz partition function oluşturmak sizin yapınıza ve ihtiyacınıza yönelik olarak düzenlemeniz gerekmektedir, biz bu örneğimizde yıllık bir tabloyu ay ay olacak şekilde partition Function oluşturacağız.
use [AdventureWorks2019] CREATE PARTITION FUNCTION [pf_PrimaryMonthly_2015](datetime) AS RANGE LEFT FOR VALUES ( N'2015-01-31T23:59:59.997', N'2015-02-28T23:59:59.997', N'2015-03-31T23:59:59.997', N'2015-04-30T23:59:59.997', N'2015-05-31T23:59:59.997', N'2015-06-30T23:59:59.997', N'2015-07-31T23:59:59.997', N'2015-08-31T23:59:59.997', N'2015-09-30T23:59:59.997', N'2015-10-31T23:59:59.997', N'2015-11-30T23:59:59.997', N'2015-12-31T23:59:59.997' ) use [AdventureWorks2019] CREATE PARTITION FUNCTION [pf_PrimaryMonthly_2016](datetime) AS RANGE LEFT FOR VALUES ( N'2016-01-31T23:59:59.997', N'2016-02-29T23:59:59.997', N'2016-03-31T23:59:59.997', N'2016-04-30T23:59:59.997', N'2016-05-31T23:59:59.997', N'2016-06-30T23:59:59.997', N'2016-07-31T23:59:59.997', N'2016-08-31T23:59:59.997', N'2016-09-30T23:59:59.997', N'2016-10-31T23:59:59.997', N'2016-11-30T23:59:59.997', N'2016-12-31T23:59:59.997' )
4.Evet şimdi de partition scheme oluşturma adımına geldik. Bir önceki adımda oluşturmuş olduğumuz partition functiona uygun olacak şekilde devam etmemiz gerekiyor. Burası belki de partition oluşturma aşamasında en kafa karıştıran ve en zorlandığımız konu olabilir şimdi bu kafa karışıklığını gidermek için bir örnek ile konuyu açıklamaya çalışalım;
Bizim bu örneğimizde aylara göre bir Function oluşturacağız dedik peki bize bunun için aylara ait verileri içerisine yerleştireceğimiz schemelar gerekiyor. Verileri doğru şekilde boundarylere yerleştirmek için range left mantığını anlamlandıralım.
Görsel-3
Yukarıdaki görselde de gördüğümüzü şimdi açıklayalım; Gireceğimiz veriler “2015-01-31T23:59:59.997” tarihi ve önce tüm veriler 1 numaralı partition boundary yerleşecek, “2015-01-31T23:59:59.997” tarihinden başlayarak “2015-02-28T23:59:59.997” tarihine kadar olan tüm veriler ise 2 numaralı partition boundary yerleşecek ve bu şekilde gidecek eğer ilgili partition function ve schemelar da ekleme yapmazsak “2015-12-31T23:59:59.997” tarihinden itibaren gelen tüm veriler 13 numaralı partition boundary yerleşecek.
Yukarıda ilgili tarihlerin partition boundary alanlarını gösteren örneğimizi görüyoruz peki önemli bir soruya cevap vermemiz gerekiyor bu kısımda o soruda şu “Peki tam olarak üst sınır değerlerine denk gelen bir değer olursa mesela ‘2016-05-31T23:59:59.997’ veya başka bir değer ‘2016-10-31T23:59:59.997’ gelirse hangi partition boundary yerleşecek ?” bunun cevabı ise kullanmış olduğumuz partition function türünde saklı, yukarıdaki left ve right partition arasındaki farklardan bahsederken left için küçük ve eşit değerler olarak açıklamaya çalışmıştık işte tam olarak burada gördüğümüz alan oluyor bu değerler left yani sol tarafında bulunan boundary yerleşecek. Örneklerimizden biri olan ‘2016-05-31T23:59:59.997’ değeri yukarıda örneği gösterilen boundary alanından Partition No:5 olan boundary alanına yerleşecek bir diğer örneğimiz olan ‘2016-10-31T23:59:59.997’ ise Partition No:10 olan boundary alanına yerleşecek.
İlgili partition scheme için örnek scriptlerimiz aşağıdaki gibi olacaktır.
CREATE PARTITION SCHEME [ps_PrimaryMonthly_2015] AS PARTITION [pf_PrimaryMonthly_2015] TO ( [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015] ) GO
Partition olarak ayarlanmış olan tablonun üzerine gelerek;
Sağ tık > Storage > Manage Compression tıkladığımızda aşağıdaki görseldeki şekilde boundarys doğru konumu bulunmaktadır.
Görsel-4
Açılan menüden göreceğimiz Partition No ve Boundary alanlarımız bizim için önemli, üst sınırı belirtilen tarihin hangi partition no denk geldiğini buradan daha net ve anlamlandırabileceğimiz şekilde görebiliyoruz. Görselimizden örnek vermek gerekirse 1 no’lu partition boundary alanına “2015-01-31T23:59:59.997” tarihine kadar olan veriler konumlanacak, 2 no’lu partition boundary alanına “2015-01-31T23:59:59.997” tarihi ile “2015-02-28T23:59:59.997” tarihi aralığında bulunan veriler konumlanacak ve bu şekilde ilerleyecek eğer ilgili partition function ve schemelar da ekleme yapmazsak “2015-12-31T23:59:59.997” tarihinden sonra gelen tüm veriler 13 no’lu partition boundary alanına konumlanacak.
Şimdi oluşturmuş olduğumuz partition ile verilerin yazılacağı tablomuzu oluşturuyoruz, örnek olarak bir tablonun create scriptini bırakıyorum burada dikkat etmemiz gereken tablomuzun ve indeximizin bağlı olduğu partition scheme ile ilişiğini belirtiyoruz aksi takdirde bunu belirtmezsek oluşturmuş olduğumuz partition kullanmamış olacağız.
USE [AdventureWorks2019] CREATE TABLE [dbo].[TestPartition_2015]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [Plaka] [varchar](15) NULL, [YakitAlinmaTarihi] [datetime] NULL, [KayitTarihi] [datetime] NOT NULL, [YakitTuru] [varchar](50) NULL, [YakitMiktari] [varchar](50) NULL, CONSTRAINT [PK_TestPartition_2015] PRIMARY KEY CLUSTERED ( [KayitTarihi] ASC, [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [ps_PrimaryMonthly_2015]([KayitTarihi]) ) ON [ps_PrimaryMonthly_2015]([KayitTarihi]) GO
Partition function oluşturma aşamalarında sizin isterlerinize ve ortamınıza göre oluşturabilirsiniz, örneğin ben burada 2015 ve 2016 yılları için ayrı ayrı Partition function ve scheme ayarladım ancak isteseydik bunları tek bir Partition function ve scheme olarak da ayarlayabilirdik. Bununda örneklerini aşağıya bırakıyorum.
use [AdventureWorks2019] CREATE PARTITION FUNCTION [pf_PrimaryMonthly_2015_2016](datetime) AS RANGE LEFT FOR VALUES ( N'2015-01-31T23:59:59.997', N'2015-02-28T23:59:59.997', N'2015-03-31T23:59:59.997', N'2015-04-30T23:59:59.997', N'2015-05-31T23:59:59.997', N'2015-06-30T23:59:59.997', N'2015-07-31T23:59:59.997', N'2015-08-31T23:59:59.997', N'2015-09-30T23:59:59.997', N'2015-10-31T23:59:59.997', N'2015-11-30T23:59:59.997', N'2015-12-31T23:59:59.997', N'2016-01-31T23:59:59.997', N'2016-02-29T23:59:59.997', N'2016-03-31T23:59:59.997', N'2016-04-30T23:59:59.997', N'2016-05-31T23:59:59.997', N'2016-06-30T23:59:59.997', N'2016-07-31T23:59:59.997', N'2016-08-31T23:59:59.997', N'2016-09-30T23:59:59.997', N'2016-10-31T23:59:59.997', N'2016-11-30T23:59:59.997', N'2016-12-31T23:59:59.997' )
CREATE PARTITION SCHEME [ps_PrimaryMonthly_2015_2016] AS PARTITION [pf_PrimaryMonthly_2015_2016] TO ( [FGAdventureWorks2019_2015Oncesi], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2015], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016], [FGAdventureWorks2019_2016Sonrasi] ) GO
Yukarıdaki örnek scriptte görüldüğü üzere istersek belirtilen tarih aralığının öncesine veya sonrasına verilerin gelmesi durumuna önlem olarak bu verileri farklı Filegroup ile farklı konumlara yazdırabiliriz, bir sonraki makalede görüşünceye dek iyi ki varsınız, sevgiler 🙂
0 Yorum