Delayed Durability, SQL Server’da transaction dayanıklılığını (durability) esnek hale getiren bir özelliktir. Normalde SQL Server, bir transaction commit edildiğinde değişikliklerin hemen diske (transaction log dosyasına) yazılmasını garanti eder (ACID prensibindeki “Durability” kuralı). Ancak Delayed Durability modunda, transaction log yazma işlemi geciktirilerek performans artışı sağlanır.
Normal transaction işlemlerinde commit işlemi oluşan log’un disk’e yazılmasında emin olmamızı sağlamaktadır. En güvenilir yöntem olarak kabul edilse bile performans anlamında yüksek I/O maliyetine sahiptir. Bu işlem herhangi bir beklemeye gelmez. Hemen tetiklenmektedir. Delayed durability ise oluşan log kaydını belleğe yazdıktan sonra diske yazma işlemini sonraya bırakır. Log buffer dolduktan sonra log kayıtları periyodik olarak diske yazılma işlemi gerçekleşmektedir. Kullanıcıya succesful bilgisi iletilmesine rağmen aslında veritabanında ilgili kayıt olmayacaktır. Bu işlem bize performans anlamında hız sağlar. Ama herhangi bir sunucu kapanması veya arıza durumlarında son zaman dilimindeki commit edilmeyi bekleyen verilerin kaybolmasına sebebiyet vermektedir.
Bu yapı yüksek yazma oranı olan veritabanlarında aktif edilebilir.(INSERT/UPDATE/DELETE) Önemsiz olan bir veritabanımız varsa örneğin sadece log kayıtlarının tutulduğu veritabanında bu özelliğin açılması performans anlamında bizlere katkı sağlayacaktır. HDD kullanılan ortamlarda bu yapının aktif edilmesi performans anlamında bizlere katkı sağlayacaktır.
Kısacası veri kaybının gereksiz olduğu ortamlarda tercih edilir dememiz yerinde bir yaklaşım olmaktadır.
Delayed Durability türleri 3 farklı şekilde çalışmaktadır. 1. yöntem FORCED seçeneğidir. Bu seçenek sayesinde Tüm log kayıtları bufferdan gecikmeli olarak commit edilmektedir. 2. seçenek kullanıcı transaction sonuna ALLOWED yapısıyla yaptığı işlem gecikmeli olmaktadır. 3. seçenek ise DISABLE yani varsayılan olarak bu yapının pasif olduğu veya pasif edildiği durum olarak karşımıza çıkmaktadır.
Delayed Durability yapısını veritabanı seviyesinde açmak için aşağıdaki komut kullanılmaktadır.
ALTER DATABASE DB_NAME
SET DELAYED_DURABILITY = ALLOWED; -- (DISABLED, ALLOWED, FORCED)
Veritabanı properties ekranında ilgili yapıyı aktif edebiliriz.

Transaction Seviyesinde Kullanma (ALLOWED Modunda)
BEGIN TRANSACTION;
INSERT INTO Orders VALUES (...);
COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON); -- Sadece bu transaction gecikmeli
Aşağıdaki komut ile hangi veritabanı üzerinde bu yapının aktif olduğunu görebiliriz.
SELECT name, delayed_durability_desc
FROM sys.databases;

Delayed durability yapısı aktif edilen veritabanlarında yoğun yazma işlemlerinde daha hızlı commit işlemleri, ayrıca disk io yükünü azaltmakta ve log file contention(çekişme) sorununu hafifletmektedir. Özellikle bulk insert işlemlerinde çok belirğin fark yaratmaktadır.
Bu makalede delayed durability yapısını detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle..
“İnsanlara merhamet etmeyene Allah merhamet etmez.” (Müslim)