SQL SERVER DATABASE TABLE RIGHT PARTITION

Bu makalede partition right 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 […]

SQL SERVER DATABASE TABLE RIGHT PARTITION

Bu makalede partition right 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 right ş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 RIGHT FOR VALUES 
(
N'2015-01-01T00:00:00:000', N'2015-02-01T00:00:00:000', N'2015-03-01T00:00:00:000', 
N'2015-04-01T00:00:00:000', N'2015-05-01T00:00:00:000', N'2015-06-01T00:00:00:000', 
N'2015-07-01T00:00:00:000', N'2015-08-01T00:00:00:000', N'2015-09-01T00:00:00:000', 
N'2015-10-01T00:00:00:000', N'2015-11-01T00:00:00:000', N'2015-12-01T00:00:00:000'
)


use [AdventureWorks2019]
CREATE PARTITION FUNCTION [pf_PrimaryMonthly_2016](datetime) AS RANGE RIGHT FOR VALUES 
(
N'2016-01-01T00:00:00:000', N'2016-02-01T00:00:00:000', N'2016-03-01T00:00:00:000', 
N'2016-04-01T00:00:00:000', N'2016-05-01T00:00:00:000', N'2016-06-01T00:00:00:000', 
N'2016-07-01T00:00:00:000', N'2016-08-01T00:00:00:000', N'2016-09-01T00:00:00:000', 
N'2016-10-01T00:00:00:000', N'2016-11-01T00:00:00:000', N'2016-12-01T00:00:00:000'
)

 

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 right mantığını anlamlandıralım.

Görsel-3

 

Yukarıdaki görselde de gördüğümüzü şimdi açıklayalım; Gireceğimiz veriler 01.01.2016 tarihi ve önce tüm veriler 1 numaralı partition boundary yerleşecek, 01.01.2016 tarihinden başlayarak 01.02.2016 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 01.12.2016 tarihinden sonra 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-04-01 00:00:00:000’ veya başka bir değer ‘2016-11-01 00:00:00:000’ gelirse hangi partition boundary yerleşecek ?” bunun cevabı ise kullanmış olduğumuz partition function türünde saklı örneğin right partition functionda yukarıdaki left ve right partition arasındaki farklardan bahsederken right için büyük değerler olarak açıklamaya çalışmıştık işte tam olarak burada gördüğümüz alan oluyor bu değerler right yani sağ tarafında bulunan boundary yerleşecek. Örneklerimizden biri olan ‘2016-04-01 00:00:00:000’ 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-11-01 00:00:00:000’     ise Partition No:12 olan boundary alanına yerleşecek.

İlgili partition scheme için örnek scriptlerimiz aşağıdaki gibi olacaktır.

CREATE PARTITION SCHEME [ps_PrimaryMonthly_2016] AS PARTITION [pf_PrimaryMonthly_2016] TO 
(  
[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_2016]
)
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 “2016-01-01T00:00:00.000” tarihine kadar olan veriler konumlanacak, 2 no’lu partition boundary alanına “2016-01-01T00:00:00.000 ” tarihi ile “2016-02-01T00:00:00.000” tarihi aralığında bulunan veriler konumlanacak ve bu şekilde ilerleyecek eğer ilgili partition function ve schemelar da ekleme yapmazsak “2016-12-01T00:00:00.000” 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_2016](
    [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_2016] 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_2016]([KayitTarihi])
) ON [ps_PrimaryMonthly_2016]([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 RIGHT FOR VALUES 
(
N'2015-01-01T00:00:00:000', N'2015-02-01T00:00:00:000', N'2015-03-01T00:00:00:000', 
N'2015-04-01T00:00:00:000', N'2015-05-01T00:00:00:000', N'2015-06-01T00:00:00:000', 
N'2015-07-01T00:00:00:000', N'2015-08-01T00:00:00:000', N'2015-09-01T00:00:00:000', 
N'2015-10-01T00:00:00:000', N'2015-11-01T00:00:00:000', N'2015-12-01T00:00:00:000',

N'2016-01-01T00:00:00:000', N'2016-02-01T00:00:00:000', N'2016-03-01T00:00:00:000', 
N'2016-04-01T00:00:00:000', N'2016-05-01T00:00:00:000', N'2016-06-01T00:00:00:000', 
N'2016-07-01T00:00:00:000', N'2016-08-01T00:00:00:000', N'2016-09-01T00:00:00:000', 
N'2016-10-01T00:00:00:000', N'2016-11-01T00:00:00:000', N'2016-12-01T00:00:00:000'
)
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 🙂

 

 

Benzer Yazılar

SQL SERVER FULL-TEXT SEARCH

SQL Server 6 gün önce

Bu makalede Sql Server ’da metin tabanlı veriler üzerinde etkili arama performansı sağlayan Full-Text Search ’ten bahsedeceğim. Full-Text Search işlemlerini yapabilmesi için Full-Text index kolona sahip olmamız gerekmektedir. Full-Text indexler, metin içeriği barındıran ve belirli veri türlerine sahip kolonlarda oluşturulabilir. Bu veri türleri “Char, Varchar, NChar, NVarchar, Text, NText, XML, Varbinary, Image ” yer alır. Full-Text index oluşturulabilmesi için ilgili tabloda tek kolonlu bir unique bir index bulunması zorunlu bir koşuldur. Bu kısım biraz daha detaylandıralım, örnek olarak mevcut ortamda bulunan tablonuzda “Id” ve “Tarih” kolonları ile partition yapınız var bu yapıda mevcut partition index unique durumda bulunuyor ama yine de full-text index oluşturamıyorsunuz çünkü tek kolonlu bir unique index gerekmektedir. Benim test ettiğim yöntemlerden birisi de “Id” ve “Tarih” kolonları ile computed column oluşturarak bu kolona unique index oluşturmaya çalışmak oldu bu yöntem ile görece unique bir kolon oluşturarak bu kolona index oluşturulabilir ancak bu computed column oluştururken tablonuza […]

Failover Cluster Yapısına Quorum Disk Witness Ekleme

SQL Server 2 hafta önce

Bu makalede mevcut Failover Cluster yapısı kurulu olan bir sistemde Quorum Disk Witness ekleme işlemini ele alacağız. Quorum disk kurulumuna geçmeden önce Quorum yapısını ne olduğundan bahsedeyim. Mevcut clusterımızın ayakta kalması için cluster database dosyalarının tutulduğu kısımdır. Bu yapının çalışabilmesi için cluster yapımızda bulunan toplam sunucuların yarısından bir fazla ile sunucu oy hakkına sahip olur ve lider olarak ayağa kalkması sağlanır. Bu yapımız olmasa da olur aslında bir sıkıntı yaşamayız. Sorun şurada karşımıza çıkar iki sunucu aynı anda down oldu ve iki sunucu aynı milisaniye zamanında ayağa kalkmaya çalışırsa mevcut sistemimizin çalışmamasına sebep olur. Bu riskin önüne geçmek için Quorum yapısı oluşturulur. Bu yapılandırmayı yapmasak ta mevcut bir sunucu down olduğunda diğer sunucu up olmaktadır. Genellikle çift yapılı node durumların oluşturulur. İki farklı quorum modeli bulunmaktadır. Bunlar Disk Witness yapısı diğeri ise File Shared Witness yapısıdır. Herhangi bir failover cluster yapısı oluşturduğumuzda cluster’daki sunucularımın göreceği ortak bir iSCSI disk yapılandırılması […]

SQL Server DMV ve DMF – 4

SQL Server 3 hafta önce

Bu yazımızda DMV ve DMF serisinin 3.’süne bakıyor olacağız. Konuya İlişkin daha detaylı bilgiye sahip olmak isterseniz ya da önceki serileri okumak isterseniz. SQL Server DMV ve DMF – I ve SQL Server DMV – II makalelerine göz gezdirilebilirsiniz. Bu yazımızda SQL Server üzerinde yoğun olarak kullandığımız ve SQL Operating system ile ilişkili bilgilere erişmek istediğimizde ihtiyacımız olan DMV ve DMF’lere göz gezdireceğiz. Bildiğiniz gibi DMV ve DMF’ler problem teşhisinde kullanıldığı gibi monitoring etmek içinde çokça kullanılmaktadır. Özellikle Operating system ile ilgili kullanmak istediğimizd sys.dm_os ile başlayanları kullanabiliriz. Peki biz hangi DMV’leri ne için ve nasıl okuyoruz? SQL Server’ın üzerinde koştuğu Windows’un bilgilerine ulaşmak için; SELECT * FROM sys.dm_os_windows_info; Görsel – 1   Windows_sku: Stock Keeping Unit Stock Keeping Unit değeri Windows_release sonucunun hexadecimal çıktısıdır. Görsel – 2 48 = 0x30 olduğunu biliyoruz. Bu değeri hesaplamak için Hexadecimal değeri Binary değere convert ederek elde edebilirsiniz.   SQL Server ve üzerinde […]

0 Yorum

Yorum Yaz

Rastgele