Sliding Window Partitioning, verileri zaman aralıklarına göre partition’lara ayırarak, eski verilerin kolayca MERGE (silme) ve yeni verilerin hızlıca SPLIT (ekleme) işlemleriyle yönetilmesini sağlar. Eski veri silinmek istendiğinde ➜ eski bir partition MERGE edilir veya tamamen DROP edilir. Slinding Window bir tabloda sürekli aynı sayıda partition’un bulunmasıdır. Hareketli partition’da denilmektedir. Aynı sayıda partitionun bulunmasını sağlamaktır. Daha sonra ilk partition’un bazı yöntemlerle(partition switch) aktarılması gerekmektedir ya da yeni bir tabloya insert edilmesi gerekmektedir.
Yeni veri geldiğinde ➜ yeni bir partition SPLIT edilir.
Bu işlemleri bir örnek üzerinden gerçekleştirmek amacım. Elimizde bulunan partition tablom 2020 yılından önceki değerleri FG2019’a, 2020 ve 2021 yılları arasındaki değerleri FG2020’ye, 2021-2022 yılları arasındaki verileri FG2021’ye, 2022-2023 yılları arasındaki verileri FG2022’e, 2023-2024 yılları arasındaki verileri FG2023’ye atan bir yapımız olacak. Partition yapımda sadece son 5 yılın partition yapısını olmasını istediğim için 2024 yılına ait veriler gelmeden yeni bir file group split edip FG2019 file group içerisinde bulunan veriyi başka bir tabloya arşivleyip FG2019 yapısını kaldırmak olmuş olacağız.
Aşağıdaki resimde de önceden oluşturduğum file group ve data file’larım görülmektedir.


File group ve data file’larımızı gördükten sonra aynı veritabanı altında veya farklı bir veritabanı altında bir scheme yapısıyla tablo oluşturmak daha sonra partition tablomuza yeni bir yıl geldikten sonra son 5 yılın partition tablomuzda olmasını istediğimiz için ilk partition file group olan FG2019’u farklı bir tabloya switch partition yapmış olacağız.
Şuna dikkat edilmesi gerekmektedir. Aynı veritabanı altında partition switch işlemi yapılır. Farklı veritabanı altında sadece insert komutuyla veri eklenebilir.
Yukarıdaki bilgiden sonra veritabanına aynı yapıda arsiv isminde tablo oluşturup verileri içerisine partition switch yöntemiyle atmış olacağım.
İlk olarak arşiv veritabanı altında boş bir tablo oluşturuyorum bunu function ve scheme’ma göre dizayn ediyorum. Partition’lı tablomuzun create scriptini alıp aynı yapıda tablomuzu oluşturmuş olacağız.
Tablomuz aynı veritabanı altında olduğu için önceden oluşturduğum function ve scheme isimleriyle aynı yapıda olabilir. Çünkü function ve scheme veritabanı bazlı oluşturulur. Partition function ve scheme yapımızın create scripti alınır. Veritabanı altında storage bölümünden sağ tıklanıp create script’i alınır. Ben yapacağımız örnekte arsiv tablomun scheme ve function yapısının farklı bir isimde olmasını sağlayacağım.
Aşağıdaki resim gerçek partition tablomuzun kullanmış olduğu function ve scheme yapısı.

Aşağıdaki scriptte bulunan kavramların ne olduğunu bilmiyorsanız ilgili makaleyi okumalısınız.
USE [PARTITIONTEST]
CREATE PARTITION FUNCTION [pf_Tarih2](datetime) AS RANGE RIGHT FOR VALUES (N'2020-01-01T00:00:00.000', N'2021-01-01T00:00:00.000',
N'2022-01-01T00:00:00.000', N'2023-01-01T00:00:00.000', N'2024-01-01T00:00:00.000')
GO
CREATE PARTITION SCHEME [ps_Tarih2] AS PARTITION [pf_Tarih2] TO ([FG2019], [FG2020], [FG2021], [FG2022], [FG2023], [FG2024])
GO


Yukaırdaki scheme ve function yapımızı oluşturduktan sonra partition tablomuzun create script’ini alıp ORNEKTABLO_ARSIV adında veritabanı üzerinde oluşturuyoruz. Partition switch yapılabilmesi için iki tablonunda aynı file group üzerinde olması gerekmektedir. Aslında aşağıdaki scriptte şöylede yapılabilir. Yıl olarak tablo oluşturulur. partition switch yapılacak ilgili file group tablo sonuna ON FG2019 şeklinde yazılabilir. Tamamen sizin tercihinize kalmış bir durumdur.
CREATE TABLE ORNEKTABLO_ARSIV(
ID INT NOT NULL,
AD VARCHAR(50) NULL,
SOYAD VARCHAR(50) NULL,
TARIH DATETIME NOT NULL
)ON ps_Tarih2(TARIH)

Yukarıdaki işlemleri tamamladıktan sonra 2024 yılı verileri için yeni bir file group ve data file tanımladıktan sonra tablo üzerinde yeni bir scheme ve function işlemi olması için split işlemi yapılır.
USE [master]
GO
ALTER DATABASE [PARTITIONTEST] ADD FILEGROUP [FG2025]
GO
ALTER DATABASE [PARTITIONTEST] ADD FILE ( NAME = N'FG2025', FILENAME = N'C:\FG\FG2025.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [FG2025]
GO
Split işlemi yapmadan önce partition tablomuzda function ve scheme yapımızı kontrol edelim. Bunun için aşağıdaki komut kullanılmaktadır.
use [PARTITIONTEST]
SELECT
OBJECT_NAME(si.object_id) AS object_name
,pf.NAME AS pf_name
,ps.NAME AS partition_scheme_name
,p.partition_number
,ds.NAME AS partition_filegroup
,rv.value AS range_value
,(
CASE pf.boundary_value_on_right
WHEN 0
THEN 'RAGE_LEFT'
ELSE 'RANGE_RIGHT'
END
) AS range_direction
,SUM(CASE
WHEN si.index_id IN (
1
,0
)
THEN p.rows
ELSE 0
END) AS num_rows
FROM sys.destination_data_spaces AS dds
INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id
LEFT JOIN sys.partition_range_values AS rv ON pf.function_id = rv.function_id
AND dds.destination_id = CASE pf.boundary_value_on_right
WHEN 0
THEN rv.boundary_id
ELSE rv.boundary_id + 1
END
LEFT JOIN sys.indexes AS si ON dds.partition_scheme_id = si.data_space_id
LEFT JOIN sys.partitions AS p ON si.object_id = p.object_id
AND si.index_id = p.index_id
AND dds.destination_id = p.partition_number
LEFT JOIN sys.dm_db_partition_stats AS dbps ON p.object_id = dbps.object_id
AND p.partition_id= dbps.partition_id
WHERE si.object_id = OBJECT_ID('[dbo].[ORNEKTABLO]')
GROUP BY ds.NAME
,p.partition_number
,pf.NAME
,pf.type_desc
,pf.fanout
,pf.boundary_value_on_right
,ps.NAME
,si.object_id
,rv.value
ORDER BY p.partition_number

Aşağıdaki kod bloğunda ise scheme yapımıza başka bir file group eklenmesi ve split range yöntemiyle ilgili function’ın eklenmesi işlemlerini görmekteyiz. Bunu yapmazsak 2024 yılındaki verilerimiz geldiğinde partition’ımız bozulmuş olacak.
ALTER PARTITION SCHEME [ps_Tarih]
NEXT USED [FG2025]
GO
ALTER PARTITION FUNCTION [pF_Tarih]()
SPLIT RANGE (N'2025-01-01T00:00:00.000')

Arşivleme yapacağımız tablomuzun partition yapımızı kontrol ettiğimizde doğru bir şekilde yapıldığını görmekteyiz.

Canlı ortamına partition yapımızın bozulmaması için function ve scheme yapımızı başarılı bir şekilde eklemiş olduk. Şimdi FG2019 file group içerisinde bulunan verileri aynı veritabanı altında oluşturduğum partition arsiv tablosuna partition switch işlemi yapalım. Bunun için aşağıdaki komut kullanılmaktadır.
Not: Switch partition işlemi sadece aynı veritabanı altında geçerlidir. Farklı veritabanı altında switch yapamazsın klasik yöntemlerle insert işlemi gerçekleştirmen gerekmektedir.
ALTER TABLE [PARTITIONTEST].dbo.ORNEKTABLO SWITCH PARTITION 1 TO [PARTITIONTEST].dbo.ORNEKTABLO_ARSIV PARTITION 1

Şimdi kontrol işlemi yapalım. Arşiv tablomuza ilgili file grouptaki tüm kayıtlarımızın geldiğini görmekteyiz.

Gerçek partition tablomuzdaki 12 değerinde silindiğini görmekteyiz. Aslında burada veriler taşınmıyor. Sadece verilerin bulunduğu yerin adı değişmektedir.

Gerçek tablomuz üzerinde ise partition’ın ilgili bölümünde rows sayısının sıfırlandığını görmekteyiz.

ALTER PARTITION FUNCTION [pf_Tarih]()
MERGE RANGE (N'2020-01-01T00:00:00.000')
Yukarıdaki yapımızda FG2020 partitiın filegroup’u silersek FG2020 içerisinde olan verilerimiz FG2019 filegroup’a gitmiş olacak.
İlk partition -∞ değerleri kapsadığı için SQL Server bu noktayı silmene izin vermez, çünkü:
- Partition function bir başlangıç noktası olmadan var olamaz.
- İlk boundary kaldırılamaz.
Bu işlemden sonra partition yapımız makalemizin başında da belirttiğim yapıda olmuş oldu.

Başka bir makalede görüşmek dileğiyle..
“O, gökleri görebileceğiniz herhangi bir destek olmadan (duracak şekilde) yarattı, sizi dengede tutması için yere sağlam dağlar yerleştirdi, orada her türlü canlının çoğalmasını sağladı. Biz, gökten su indirip (bununla) yeryüzünde her türden faydalı bitkiler bitirdik.”Lokman-10