Partitioned View Nedir ve Nasıl Yapılır
Bildiğiniz gibi partition büyük tabloların küçük tablolara bölünmesidir. Partition ile ilgili detaylı bilgi almak için “Partition Oluşturmak” isimli makalemi okumak isteyebilirsiniz.
SQL Server 2016 ‘dan önceki sürümlerde Table Partitioning Standart Edition’da desteklenmiyordu. Bu yüzden Standart Edition kullanan kurumlar table partitioning yapamıyordu. Bunun yerine Partitioned View ile bu sorun kısmen çözülebiliyor. SQL Server 2016 ve sonrası bir sürüm kullanıyorsanız altyapınız uygun olduğu takdirde partitioned view yerine table partition kullanmanızı öneririm.
Bir örnek yaparak konuyu netleştirelim.
Aşağıdaki gibi 12 adet tablo oluşturuyoruz ve içlerine her ay için bir kayıt giriyoruz. Partitioned View yapabilmemiz için partition olacak kolonda CHECK constraint olması gerekiyor. “CHECK CONSTRAINT” isimli makalemi okumak isteyebilirsiniz.
CREATE TABLE TabloOCAK (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 1), CONSTRAINT [PK_TabloOCAK] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloSUBAT (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 2), CONSTRAINT [PK_TabloSUBAT] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloMART (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 3), CONSTRAINT [PK_TabloMART] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloNISAN (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 4), CONSTRAINT [PK_TabloNISAN] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloMAYIS (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 5), CONSTRAINT [PK_TabloMAYIS] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloHAZIRAN (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 6), CONSTRAINT [PK_TabloHAZIRAN] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloTEMMUZ (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 7), CONSTRAINT [PK_TabloTEMMUZ] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloAGUSTOS (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 8), CONSTRAINT [PK_TabloAGUSTOS] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloEYLUL (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 9), CONSTRAINT [PK_TabloEYLUL] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloEKIM (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 10), CONSTRAINT [PK_TabloEKIM] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloKASIM (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 11), CONSTRAINT [PK_TabloKASIM] PRIMARY KEY CLUSTERED ([ID] ASC) ) CREATE TABLE TabloARALIK (ID INT, MusteriID INT NOT NULL, SiparisAyi INT NULL CHECK (SiparisAyi = 12), CONSTRAINT [PK_TabloARALIK] PRIMARY KEY CLUSTERED ([ID] ASC) ) USE [Test] GO INSERT INTO [dbo].[TabloOCAK]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,1) INSERT INTO [dbo].[TabloSUBAT]([ID],[MusteriID],[SiparisAyi]) VALUES (1,314,2) INSERT INTO [dbo].[TabloMART]([ID],[MusteriID],[SiparisAyi]) VALUES (1,314,3) INSERT INTO [dbo].[TabloNISAN]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,4) INSERT INTO [dbo].[TabloMAYIS]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,5) INSERT INTO [dbo].[TabloHAZIRAN]([ID],[MusteriID],[SiparisAyi]) VALUES (1,314,6) INSERT INTO [dbo].[TabloTEMMUZ]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,7) INSERT INTO [dbo].[TabloAGUSTOS]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,8) INSERT INTO [dbo].[TabloEYLUL]([ID],[MusteriID],[SiparisAyi]) VALUES (1,314,9) INSERT INTO [dbo].[TabloEKIM]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,10) INSERT INTO [dbo].[TabloKASIM]([ID],[MusteriID],[SiparisAyi]) VALUES (1,314,11) INSERT INTO [dbo].[TabloARALIK]([ID],[MusteriID],[SiparisAyi]) VALUES (1,324,12)
Aşağıdaki script yardımıyla da partitioned view’i oluşturuyoruz.
CREATE VIEW PartitionedViewOrnek AS SELECT * FROM TabloOCAK UNION ALL SELECT * FROM TabloSUBAT UNION ALL SELECT * FROM TabloMART UNION ALL SELECT * FROM TabloNISAN UNION ALL SELECT * FROM TabloMAYIS UNION ALL SELECT * FROM TabloHAZIRAN UNION ALL SELECT * FROM TabloTEMMUZ UNION ALL SELECT * FROM TabloAGUSTOS UNION ALL SELECT * FROM TabloEYLUL UNION ALL SELECT * FROM TabloEKIM UNION ALL SELECT * FROM TabloKASIM UNION ALL SELECT * FROM TabloARALIK
Aşağıdaki sorgu yardımıyla partitioned view’i kullanabiliriz.
SELECT * FROM PartitionedViewOrnek WHERE SiparisAyi IN (5,6)
Aşağıdaki ekran görüntüsünde göreceğiniz üzere partitoned view’de filtre olarak SiparisAyi kolonunu kullanırsak sadece ilgili tablolara giderek kısmi bir partition faydası elde edebiliriz. Execution planda sadece iki tabloya gittiğini görebilirsiniz.