Partitioned View Nedir ve Nasıl Yapılır

12 May by NURULLAH ÇAKIR

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.

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir