Sepetiniz

WAIT_AT_LOW_PRIORITY ile Online Index Rebuild ve Partition Switch İşlemlerini Kontrol Edin

WAIT_AT_LOW_PRIORITY SQL Server 2014 ile beraber gelen bir özelliktir. Online Index Rebuild ve switch partition işlemlerini yaparken süreci kontrol edebiliyoruz.

 

Örneğin Online Index Rebuild işlemi yaptığımızı düşünelim. Online Index Rebuild işlemi bir transaction tarafından lock’lanabilir. Ve bu şekilde uzun bir süre işlem tamamlanmayabilir. 

 

Mesela bir uygulama geliştirici bir transaction açtı ve commit işlemini gerçekleştirmedi. Online Index Rebuild işlemi bu commit gerçekleşene kadar lock’ta bekleyebilir. WAIT_AT_LOW_PRIORITY ile bunu önleyebiliyoruz.

 

Aşağıdaki sorguyu inceleyelim.

WAIT_AT_LOW_PRIORITY ‘den sonra MAX_DURATION = 1 MINUTES kısmında online index rebuild işlemi lock’lı kalırsa 1 dakika beklemesini, ABORT_AFTER_WAIT = SELF kısmında da, 1 dakika bekledikten sonra online index rebuild işlemini cancel etmesini söylemiş oluyoruz.

 

SELF yerine,

 

NONE yapsaydık online rebuild index işlemi devam edecekti.

 

BLOCKERS yapsaydık da online index rebuild işlemini lock’layan sorgu kill edilecekti.

ALTER INDEX IndexIsmi
ON dbo.TabloIsmi
REBUILD WITH (ONLINE = ON (
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 1 MINUTES, ABORT_AFTER_WAIT = SELF ))
 );

 

 

Aşağıdaki gibi de switch partition’da kullanabilirsiniz. Switch partition ile ilgili “Sliding Window-Switch Partition-Split Range-Merge Range” isimli makaleyi okumak isteyebilirsiniz.

ALTER TABLE [VeritabaniIsmi].[dbo].[TabloIsmi] 
SWITCH PARTITION 12 TO [VeritabaniIsmi].[dbo].[TabloIsmiArsiv]
WITH (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 1 MINUTES, ABORT_AFTER_WAIT = SELF));

 

Partition Switch Yapılamıyor

Eğer partition yapılmış tablonuzdaki tüm index’ler parittion’a göre align edilmemişse aşağıdaki gibi hata alırsınız.

Msg 7733, Level 16, State 4, Line 44

‘ALTER TABLE SWITCH’ statement failed. The table ‘AdventureWorks2014_new.Sales.SalesOrderDetail’ is partitioned while index ‘AK_SalesOrderDetail_rowguid’ is not partitioned.

 

Partition Switch ile ilgli detayları “Sliding Window-Switch Partition-Split Range-Merge Range” isimli makalede bulabilirsiniz.

 

Partition’a dahil edilmemiş index’leri partition’a dahil etmek için(align işlemi) aşağıdaki gibi partition yapılmış tabloda hatada belirtilen index’e sağ tıklayarak properties diyoruz.

 

Storage kısmından Partition scheme’yı tıklıyoruz ve alt satırda aşağıdaki gibi karşımıza çıkan seçenekleri seçerek Script’e tıklayarak yaptığımız değişikliklerin script’ini alıp cancel diyoruz.

 

 

Karşımıza aşağıdaki gibi bir script çıkarıyor.

USE [AdventureWorks2014_new]
GO
CREATE UNIQUE NONCLUSTERED INDEX [AK_SalesOrderDetail_rowguid] ON [Sales].[SalesOrderDetail]
(
[rowguid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PartFunc]([CarrierTrackingNumber])
GO

 

Script’te gördüğünüz gibi index’i yeniden ilgili partition şema üzerinde oluşturuyor. Sadece ONLINE=OFF kısmında ON yaparak script’in sisteminizde kesinti olmadan çalışmasını sağlayabilirsiniz. Script’in index’i yeniden oluşturma işlemi bittiğinde script’i tekrar çalıştırdığınız Switch işlemi başarılı bir şekilde tamamlanacaktır. Tabi tablodaki diğer index’lerin de aynı şekilde partition şema’ya göre align edilmiş olması gerekiyor.

 

Primary Key’i aynı şekilde yapamazsınız. Bunun için Primary Key’in DROP CREATE Script’ini alıp aşağıdaki gibi  create ederken key’lerin sonuna partition yapılmış kolon’u ekleyip daha sonra da script’in en sonuna ON partition schema ismi parantez içinde partition kolonu şeklinde eklemeniz gerekiyor.

ALTER TABLE [Sales].[SalesOrderDetail]
ADD  CONSTRAINT [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY NONCLUSTERED
(
       [SalesOrderID] ASC,
       [SalesOrderDetailID] ASC,
       CarrierTrackingNumber
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = ON,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PartSchema]([CarrierTrackingNumber])

 

Partition oluşturmak ile ilgili detayları “Partition Oluşturmak” isimli makalede bulabilirsiniz.

 

Partition yapılmış tabloları ve detaylarını görmek için aşağıdaki makalelerden de faydalanabilirsiniz.

 

Veritabanında Partition Yapılmış Tabloları Bulmak“,

Partition Yapılmış Tablodaki Partition Detaylarını Görmek