3. Katıldığım
seminer Turgay SAHTİYAN hocanın How Latch Contention Affects the Performance? adlı
semineriydi.
Bu seminerde
öncelikle olarak latch nedir ve lock nedir ve aralarındaki farklar
konuşuldu.
Latch nedir tanımına
bakacak olursak birden fazla process memoryde bulunan bir page'i değiştirmek
isterse SQL Server ilk isteyen process için latch koyar. Diğer processlerinde işlem yapmasını
engeller. Aynı anda bir fazla process page üzerinde değişiklik yapabilseydi
page tutarlılığı bozulurdu. Bu koyulan Latch'e PageLatch_EX adı verilir.
Aynı işlem bir
page'in diskten memorye getirilmesi sırasındada olur. Bunada PageIOLatch_EX adı
verilir.
DB serverda birden
fazla Cpu varsa aynı objeye paralel olarak erişen process sayısı artacaktır.
Aynı objeye birden fazla process erişmek isteyebileceğinden dolayı latch
yaşanması kaçınılmazdır.
Latchler ile locklar
birbirine oldukça benzerler ancak aralarında bir fark vardır. SQL Server lock'ı
transaction tamamlanana kadar koyarken latch'i fiziksel operasyon bitene
koyar. İlgili page'de fiziksel işlem
bitince latch kalkarken lock transaction tamamlanıncaya kadar durur.
Latchler
üzerinde kullanıcılar hiçbir işlem
yapamazken locklar üzerinde transaction level ile oynayarak değişiklikler
yapabilirler.
Latch analizi
için Sys.dm_exec_wait_stats
ve sys.dm_exec_latch_stats DMVleri
kullanılırken lock analizi için ise sys.dm_tran_locks ve sys.dm_exec_sessions DMVleri kullanılır.
Ayrıca Latch
Contentiondan Hash partitioning yöntemi üzerine konuşuldu. Bir bankada DBA
olarak çalışıyoruz. 1400 tane bankamatik şubemiz var. Her yapılan işlem bir
identity kolonda veya bir sequence nesnesinden bir numara alarak ID kolonuna
üzerine veri olarak işlenmektedir. Bu kolon clustered indexdir.
Her yapılan işlemi
her zaman son page üzerine yapılacağı için latch contention'dan kaçmak nerdeyse
imkansızdır.
Bundan
kaçmak için Clustered Index'te değişiklik yaparak BankamatikID ekleyebiliriz.
Ancak bu durumda leading kolon olarak
non-sequential bir kolon seçildiği için Page Split ve
index fragmentation ile karşılaşılacağız.
Burada çözüm
tablodaki bir kolon üzerinden oluşturulan bir hash value üzerine partitioning
yapmaktır. Bu şekilde gelen insert’ler sıralı olarak farklı partition’lara
dağılacak ve hep aynı page’e erişim olmayacağından dolayı contention
çözümlenmiş olacaktır.