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));

 

Index’i Disable Etmek

SQL Server 2005 ile index’ler artık disable edilebiliyor. Index disable edilirse tekrar enable etmek için index’i rebuild etmek gerekiyor. Clustered Index’i disable ederseniz, clustered index’in olduğu tablo erişilemez olacaktır. Tabloya erişimi istemediğiniz durumlarda tablo üzerindeki yetkileri kaldırmak karmaşık bir işlemse uygulayabilirsiniz.

 

Disable etmek istediğiniz index üzerinde sağ tıklayarak disable dediğinizde karşınıza aşağıdaki gibi bir ekran gelecektir. Bu ekranda index tanımının metadata’da tutulacağını ve yukarda belirttiğimiz sonuçları ifade ediyor. Ok diyerek disable edebilirsiniz.

 

 

Clustered Index’i disable ettikten sonra tabloya select çekmek istediğinizde aşağıdaki gibi bir hata alırsınız.

 

Msg 8655, Level 16, State 1, Line 2

The query processor is unable to produce a plan because the index ‘IX_Clustered’ on table or view ‘FamousFood ‘ is disabled.

 

Disable edilmiş bir index’i tekrar enable etmek için ALTER INDEX REBUILD ya da CREATE INDEX WITH DROP_EXISTING komutlarını kullanmanız gerekiyor. Index Rebuild işlemi için

ALTER INDEX [IX_Clustered] ON [dbo].[FamousFood ] REBUILD

 

CREATE UNIQUE CLUSTERED INDEX [IX_Clustered] ON [dbo].[FamousFood ]
(
[ID] ASC
)WITH (DROP_EXISTING = ON)

 

Bir ya da birden fazla index upgrade sırasında otomatik olarak disable edilebilir. Bu yüzden upgrade sırasında buna dikkat etmek gerekir. 

 

Microsoft, buna sebep olarak’ta sistem fonksiyonlarını kullanan bir index upgrade sonrası değişik bir sonuç getirebilir, ya da upgrade’in bir parçası olarak collation değişikliği sonucu index yanlış sıralanabilir, bu yüzden upgrade sırasında bu tip index’ler disable hale getirilir diyor.

 

Upgrade sırasında bir index disable edilirse, index ismi ve ilgili constraint ismi uyarı mesajı olarak gösterilir. Böylece upgrade sonrası bu index’leri rebuild ederek tekrar aktif hale getirebilirsiniz.

 

Index’i disable etmeden rebuild ederseniz ve DROP_EXISTING=ON demezseniz, index rebuild işlemi sırasında hem eski hem de yeni index için ekstra alana ihtiyaç duyulur. Ama index’i disable ettikten sonra başka bir transaction’da rebuild işlemi gerçekleştirirseniz sıralama işlemi için yaklaşık %20’lik bir geçici disk alanının dışında ekstra bir disk alanı gerekmez.

 

Kullanılmayan index’leri silmeden önce bir süre kalması için disable edebilirsiniz. Kullanılmayan index’leri tespit etmek için “Kullanılmayan Index’leri Tespit Etmek” isimli makaleye göz atmak isteyebilirsiniz.

 

Disable edilmiş index’leri bulmak için aşağıdaki script’i kullanabilirsiniz.

SELECT o.name,i.name from sys.indexes i
    INNER JOIN sys.objects o on o.object_id = i.object_id
WHERE i.is_disabled = 1
ORDER BY o.name,i.name