MSSQL Server WAIT_AT_LOW_PRIORITY

Bu makalede MSSQL Server WAIT_AT_LOW_PRIORITY kavramını detaylı bir şekilde görmüş olacağız. Microsoft SQL Server’da “WAIT_AT_LOW_PRIORITY” kavramı, kilitlenme riskini azaltmak ve sistem performansını optimize etmek için kullanılan bir bekleme mekanizmasıdır. Bu mekanizma genellikle bir tablo veya nesne üzerinde işlem yaparken (örneğin, bir tabloyu yeniden oluşturma, bir indeks oluşturma veya bölme işlemleri gibi) diğer işlemleri engellemek yerine belirli bir öncelik düzeyinde beklemeyi sağlar. Bu sayede, yüksek öncelikli işlemler çalışmaya devam ederken düşük öncelikli işlemlerin beklemesi sağlanır.
1. Amaç:
Aynı kaynak üzerinde çalışan işlemler arasında kilitlenme riskini azaltmak. Yüksek öncelikli işlemlerin performansını etkilemeden düşük öncelikli işlemlerin sıraya girmesini sağlamak.

2. Kullanım Alanları:
 Online indeks yeniden oluşturma (rebuild) işlemleri.
 Tablo bölme (partitioning) ve bölme değişiklikleri.
 Yoğun işlem gören veritabanlarında, uzun sürebilecek DDL (Data Definition Language) işlemlerinin etkisini en aza indirmek için.
3. Nasıl Çalışır?
Bir işlem WAIT_AT_LOW_PRIORITY seçeneği ile çalıştırıldığında:
Öncelikle bir tablo veya satır üzerinde erişim hakkı kazanmayı dener. Eğer kaynak başka bir işlem tarafından kullanılıyorsa, belirli bir süre (veya belirli bir koşula) kadar bekler. Bu süre zarfında, düşük öncelikli işlem diğer işlemleri engellemez ve kilitlenmelere neden olmaz. Bekleme süresi dolduğunda ya işlemi sonlandırır ya da farklı bir eyleme geçer (örn. işlem iptal edilir).
4. Örnek Senaryo:
Bir tablo üzerinde INDEX REBUILD işlemi gerçekleştirmek istiyorsunuz, ancak tablo üzerinde aktif olarak sorgular çalışıyor. Normalde bu işlem tabloyu kilitleyerek diğer işlemleri engelleyebilir. Ancak, WAIT_AT_LOW_PRIORITY seçeneği kullanılırsa, işlem kilitlenmeye neden olmadan bekler ve belirtilen koşullara göre ya devam eder ya da iptal edilir.

Bir işlemde WAIT_AT_LOW_PRIORITY seçeneğini kullanmak için, genellikle DDL komutlarında bu seçenek belirtilir.

Örneğin:

ALTER INDEX [Index_Adı]
ON [Tablo_Adı]
REBUILD WITH (maxdop=64,ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = SELF)));

Parametreler:
MAX_DURATION: Bekleme süresinin maksimum uzunluğu. Bu süre dolduğunda işlem iptal edilir veya devam eder.
ABORT_AFTER_WAIT: Bekleme süresi dolduğunda ne yapılacağını belirtir
NONE: İşlem beklemeye devam eder.
SELF: Bekleyen işlem iptal edilir.
BLOCKERS: Beklemeyi engelleyen işlemler iptal edilir.

Faydaları yüksek öncelikli sorguların kesintiye uğramasını engeller. Kilitlenme (deadlock) riskini azaltır. Sistem kaynaklarının daha verimli kullanılmasını sağlar.

ABORT_AFTER_WAIT parametresi dikkatli seçilmelidir; yanlış bir ayar, kritik işlemleri beklenmedik şekilde sonlandırabilir. Sistem üzerinde sürekli çalışan çok sayıda işlem varsa, düşük öncelikli işlemler uzun süre bekleyebilir veya iptal edilebilir.

Örneğin bir üretim ortamında yüksek yoğunluklu bir veri tabanında çevrim içi indeks yeniden oluşturma işlemi yapmak istiyorsunuz. Aşağıdaki gibi bir komutla, diğer işlemleri etkilemeden yeniden oluşturma işlemini başlatabilirsiniz:

ALTER INDEX ALL ON Sales.Revenue REBUILD 
WITH (maxdop=16,ONLINE = ON( WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10 MINUTES,  ABORT_AFTER_WAIT = SELF)));

Bu komut, 10 dakika boyunca bekleyecek ve bu süre içinde işlem kilitlenme yaratmadan sıraya girecek. 10 dakikalık süre dolarsa, yeniden oluşturma işlemi iptal edilir.
Başka bir örnek senaryo üzerinden işlemlerimize devam edelim.
Sales adında partitions yapılmış bir tablo var. Bu tablonun partition yapılmış 5. bölümü, eski veriler için kullanılan SalesHistory tablosunun partition yapılmış 5. bölümüne taşınmak isteniyor. Bu işlem sırasında başka işlemleri engellememek ve kilitlenme riskinden kaçınmak için WAIT_AT_LOW_PRIORITY kullanıyoruz.

 SQL Komutu:

ALTER TABLE Sales SWITCH PARTITION 5 TO SalesHistory PARTITION 5
WITH (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 15 MINUTES, ABORT_AFTER_WAIT = BLOCKERS));

Sales tablosunun 5. bölümü ile SalesHistory tablosunun 5. bölümü arasında hızlı bir partition switch yapılır.
İşlem, diğer işlemleri bloke etmemek için düşük öncelikli modda çalıştırılır. İşlem başlar ancak gerekli kaynaklar doluysa (örneğin tablo üzerinde başka işlemler varsa) beklemeye alınır.
Parametreler:
MAX_DURATION = 15 MINUTES: İşlem maksimum 15 dakika boyunca bekler.
ABORTAFTERWAIT = BLOCKERS: 15 dakika sonunda işlem tamamlanamazsa, beklemeye neden olan işlemler sonlandırılır ve işlem devam eder.

Eğer ABORT_AFTER_WAIT = BLOCKERS kullanılmışsa, kilidi tutan işlemler iptal edilir ve switch işlemi devam eder.
Eğer ABORT_AFTER_WAIT = SELF kullanılmışsa, switch işlemi iptal edilir ve diğer işlemler çalışmaya devam eder.

Bu yöntem, yoğun bir sistemde kilitlenme riskini azaltır ve yüksek öncelikli sorguların kesintiye uğramasını engeller. BLOCKERS seçeneği, kritik işlemler sırasında kullanılabilir; ancak dikkat edilmesi gerekir, çünkü diğer işlemleri sonlandırabilir.

Bu makalede sql server yapımızda WAIT_AT_LOW_PRIORITY kavramını detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle..

Ey iman edenler, sabırla ve namazla yardım dileyin. Gerçekten Allah, sabredenlerle beraberdir. Bakara Suresi, 153. Ayet



Author: Yunus YÜCEL

Bir yanıt yazın

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