MSSQL Server’da LATCH_EX Bekleme Tipi

SQL Server dünyasında LATCH_EX, genellikle performans sorunları yaşandığında karşımıza çıkan, “arka plan trafiğindeki bir tıkanıklığa” benzeyen bir bekleme tipidir.
Kısaca özetlemek gerekirse; SQL Server veriye erişmek için Lock (Kilit) kullanırken, bellekteki veri yapılarını korumak için Latch (Mandal) kullanır.

LATCH, SQL Server’ın bellek içindeki veri yapılarını (örneğin Buffer Pool içindeki sayfaları) korumak için kullandığı hafif sıklet bir senkronizasyon mekanizmasıdır. EX (Exclusive) ise bu kaynağa o an sadece tek bir işlemin erişebileceği, diğerlerinin beklemek zorunda olduğu anlamına gelir.

Lock (Kilit): Mantıksaldır. Tabloyu veya satırı korur. İşlem (Transaction) bitene kadar sürebilir.
Latch (Mandal): Fizikseldir. Bellekteki veri sayfasını korur. Saniyenin çok küçük bir kesri kadar sürer.

Eğer sisteminizde bu bekleme tipi yüksekse, SQL Server bellekteki bir kaynağı güncellemeye çalışıyor ama o kaynağa erişmek için kuyrukta bekleyen çok fazla işlem var demektir.

En Yaygın Sebepler ve Çözümler

1. TEMPDB Darboğazı (PAGELATCH_EX)
En sık karşılaşılan senaryodur. Eğer çok fazla geçici tablo (#table) oluşturuyorsanız, sistem bu tabloları yöneten özel sayfalara (PFS, GAM, SGAM) yazmaya çalışırken çakışma yaşar. SQL Server versiyonunuz eskiyse TempDB veri dosyası sayısını işlemci çekirdek sayısına göre artırın (Genellikle 8 dosya idealdir). Modern versiyonlarda bu otomatik yönetilir ancak kontrol etmekte fayda var.
2. Yüksek İnsert/Update Alan Tablolar
Aynı veri sayfasına sürekli veri eklenmesi (özellikle Identity kolonu olan tablolarda) sayfanın sonuna yazma yarışı başlatır.
Index tasarımını gözden geçirin. Eğer mümkünse “Hash Index” veya “Optimized for Sequential Key” gibi özellikler kullanın.
3. Donanım Yetersizliği
Eğer bellek (RAM) yetersizse, SQL Server sürekli diske gidip veri sayfasını belleğe getirmeye çalışır. Bu işlem sırasında sayfa üzerine “Latch” koyulur.
Page Life Expectancy (PLE) değerini kontrol edin. Eğer çok düşükse RAM artırımı gerekebilir.

Aşağıdaki sorgu ile sisteminizdeki bekleme sürelerini görebilirsiniz:

SELECT wait_type, wait_time_ms, wait_time_ms / 1000.0 AS wait_time_s
FROM sys.dm_os_wait_stats
WHERE wait_type = 'LATCH_EX'
ORDER BY wait_time_ms DESC;

Not: LATCH_EX değerinin yüksek olması her zaman bir felaket değildir. Önemli olan bu sürenin toplam çalışma süresine oranıdır.

Özetle Yapılması Gerekenler:

  • TempDB konfigürasyonunuzu kontrol edin.
  • Çok sık güncellenen tablolardaki Index yapısını optimize edin.
  • MAXDOP (Maximum Degree of Parallelism) ayarlarının yanlış yapılandırılması da bu beklemeyi tetikleyebilir; işlemci sayınıza uygun bir değer atadığınızdan emin olun.

Başka makalede görüşmek dileğiyle..

Başkaları ile alay etmeyin. Hucurat-11

Author: Yunus YÜCEL

Bir yanıt yazın

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