SQL SERVER DATABASE TABLE LEFT PARTITION

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 […]

SQL SERVER DATABASE TABLE LEFT PARTITION

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 🙂

 

 

 

 

 

 

Benzer Yazılar

SQL SERVER RIGHT-LEFT PARTITION

SQL Server 5 gün önce

SQL Server’da partitioning, büyük veritabanı tablolarını daha yönetilebilir ve performanslı hale getirmek amacıyla kullanılan bir tekniktir. Bu teknik, tablonun verilerini fiziksel olarak değil, mantıksal olarak parçalara ayırır. Veriler, belirli bir partition function ve partition scheme kullanılarak farklı bölümlere yönlendirilir. Partitioning, özellikle büyük veri kümeleriyle çalışan veri tabanlarında sorgu performansını artırır ve veri yönetimini kolaylaştırır. Partition Function ve Partition Scheme nedir? Partition Function: Verilerin hangi kriterlere göre bölüneceğini belirler. Örneğin, bir tarih aralığına göre verileri ayırmak. Partition Scheme: Verilerin hangi filegroup’larda depolanacağını belirler.   Örnek olarak Range LEFT ve Range RIGHT olmak üzere iki ayrı tabloda partition nasıl yapılır sizlere göstereceğim. İlk olarak Range LEFT olan partition yapısından başlayacağım. Öncelikle Veri tabanıma yeni filegroup ve file ekliyorum Şimdi sıra FUNCTION ve SCHEME oluşturmakta ben tablomu yıllık olarak partition yaptım sizler ihtiyaçlarınız doğrultusunda aylık,günlük vs yapabilirsiniz. LEFT partition dediğimiz olay vermiş olduğunuz tarih aralığına eşit bir veri geldiğinde bu veriyi solundaki partition […]

Veritabanı Recovery Pending Durumu ve Düzeltme Seçenekleri

SQL Server 2 hafta önce

İçindekilerVeritabanı Recovery Pending Durumu Nedir?Veritabanı Neden Recover Pending Duruma Düşer?Recovery Pending Durumu Nasıl Çözülür?SonuçKaynaklarVeritabanı Recovery Pending Durumu Nedir? SQL Server’da veritabanları bazı nedenlere bağlı olarak “Recovery Pending” (Kurtarma Bekleme)  moduna geçebilir. Veritabanın düzgün bir şekilde kapatılmaması, eksik veya bozuk log dosyaları, disk depolama sorunları, sistemde yaşanan anormal şekilde çökmeler veya MS SQL Server’daki hatalar bu duruma sebep olabilir. Recovery durumu, aslında veritabanını tekrar kullanılabilir hale getirmek için bir kurtarma işlemi yürüttüğünü ifade eder ve üç aşamadan oluşur; Analysis (Analiz): Transaction log incelemesi yapılması ve işlemlerin tamamlanma (Commit) durumunun kontrol edilmesi, Redo (Yeniden İşleme): Tamamlanmış (Commit) ancak henüz diske yazılamamış olan işlemlerin yeniden işlenmesi, Undo (Geri Alma): Başlamış (Begin) ancak tamamlanmamış (Commit) işlemlerin  geri alınmasıdır.   Veritabanı Neden Recover Pending Duruma Düşer? SQL Server Restart Süreci SQL Server servisi restart edildiğinde üzerinde bulunan tüm veritabanları tutarlılığın sağlanması için otomatik olarak recovery moduna girer ve redo/undo işlemleri sürecince devam eder. Ani Sistem […]

SQL Server DMV ve DMF – 6

SQL Server 2 hafta önce

Bu yazımızda DMV ve DMF Serimizin 6.sına devam edeceğiz. Bir önceki seride Memory’ye ilişkin DMV ve DMF’leri ele almıştık. Bu yazıda Memory konusunda devam edeceğiz. SQL server’da Memory kavramı en önemli kavramlardan biridir. Özellikle tüm transaction işlemlerinin önce Buffer sonra disk üzerinden devam ettiğini düşünürsek buffer’ın oynadığı kritik rolü daha iyi anlayabiliriz. Bu yazıda Memory’nin durumunu ve monitör edilmesine bakacağız. Özellikle Performans sorunlarında memory konusunda sorun yaşandığı durumda nasıl okumak gerektiği önemli rol oynamaktadır. Hangi database’de, hangi tablo’da sorun yaşandığına ilişkin bilgilere bu paylaşım sonrasında görebileceğiz. SQL Server’ın Memory kullanım durumunu incelediğimde; select physical_memory_in_use_kb/1048576.0 AS ‘physical_memory_in_use (GB)’, locked_page_allocations_kb/1048576.0 AS ‘locked_page_allocations (GB)’, virtual_address_space_committed_kb/1048576.0 AS ‘virtual_address_space_committed (GB)’, available_commit_limit_kb/1048576.0 AS ‘available_commit_limit (GB)’, page_fault_count as ‘page_fault_count’ from  sys.dm_os_process_memory; Görsel – 1   Physical_memory_in_use: Kullanımda olan Fiziksel Memory miktarını gösterir. locked_page_allocations: Memory’de lock’lanmış olan Page’lerin miktarını belirtir. virtual_address_space_contained: SQL Server VAS(Virtual Adress Space) için ayrılan miktarı belirtir. available_commit_limit: SQL Server tarafından kullanılabilecek Memory Miktarını gösterir. […]

0 Yorum

Yorum Yaz

Rastgele