18 Aralık 2014 Perşembe

SQL Saturday 359 -3( How Latch Contention Affects the Performance? )


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.


Sql Server DateTime Veri Tipindeki Datayı Türkçe Formatında Göstermek

  SQL'de tarihleri farklı formatlarda göstermek için FORMAT fonksiyonunu kullanabilirsiniz. Türkçe kısa tarih formatı genellikle "...