Salı , 19 Haziran 2018

SQL Server 2012 Indirect Checkpoint Özelligi

Checkpoint, SQL Server Database Engine servisi tarafından çalıştırılan ve Buffer Cache diye adlandırılan bellek bölgesindeki Dirty Page’lerin diske yani data dosyasına yazılması işlemidir. Dirty Page kavramı ise az önce bahsettiğimiz Buffer Cache bellek bölgesinde bulunan ve üzerinde değişlik yapılmış(delete,update vb) fakat hala fiziksel olarak diske yazılmamış page olarak adlandırılmaktadır. Yani bir veri üzerinde bizim yapmış olduğumuz değişlikler doğrudan data dosyası üzerinde yapılmaz öncelikle değiştirilecek verinin saklandığı page Buffer Cache denilen bellek bölgesine alınır ve burada gerekli değişlikler yapıldıktan sonra SQL Serverın Checkpoint komutunu çalıştırmasıyla fiziksel olarak data dosyasına yazılır. Fakat dikkat ederseniz yapılan bir değişlik belli aralıkla data dosyasına yazılıyor ve yazılana kadar Buffer Cache dediğimiz bellek bölgesinde yani diğer ifadeyle RAM’de tutuluyor. Bu yapının avantajı RAM’in diske göre daha hızlı olması sebebiyle okuma ve yazma işlemleri için veriye erişim hızlı oluyor fakat Checkpoint komutu öncesinde data dosyasına yazılmamış veriler SQL Server’ın ani durumlarda beklenmedik bir şekilde kapanmasıyla data dosyasına yazılmamış olacaktır.

Bildiğimiz gibi bu yazılmayan veriler tabi ki kaybolmayacaktır çünkü fiziksel olarak data dosyasında değişlik yapılmamış olsa bile veritabanımızın log dosyasında bu işler tutulacak ve biz SQL Server tekrara başlattığımızda bu işler data dosyasına yazılacaktır. Fakat bu işlemlerin data dosyasına yazılmasına kadar geçen sürede veritabanı erişilmez durumda olacaktır. Bu erişilmez olma süresini azaltmak adına yapılabilecek en pratik çözüm Checkpoint sıklığını artırarak iki Checkpoint arasındaki süreyi azaltmak olacaktır. Fakat SQL Server 2012 öncesindeki sürümlerde Checkpoint süresi dakika bazında değiştiriliyordu ve yapılan bu değişlik SQL Server bazında geçerli oluyordu. Yani kullandığımız tüm veritabanları için aynı Checkpoint süresini kullanabiliyorduk. Fakat SQL Server 2012 ile beraber her veritabanı özel olarak saniye seviyesinde değer verebileceğimiz ve adına Indirect Checkpoint denilen bir özellik eklendi. Target Recovery Time (Seconds) adıyla eklenen bu özellikle yukarıda da belirttiğim gibi veritabanı seviyesinde bir özellik olup her veritabanımız için değişken değerler kullanabileceğimiz şekilde özelleştirildi. Şimdi bu parametrenin kullanılan değerine nasıl bakacağımız ve nasıl değiştirebileceğimize değinelim.

İlk olarak Target Recovery Time (Seconds) parametresine erişmek için sys.databases kataloğundaki target_recovery_time_in_seconds kolonundaki değere aşağıdaki gibi bakalım.

indirect checkpoint

Yukarıdaki resimde gördüğümüz gibi bu değer 0(sıfır) olarak set edilmiştir. 0 değeri varsayılan değer olup bu değerin değiştirilmediğini yani Indirect Checkpoint kullanılmadığı anlamına gelmektedir. Şimdi bu değeri değiştirmek için ilgili veritabanı üzerinde sağ tıklayıp aşağıdaki gibi Properties penceresini açalım.

indirect checkpoint2

Yukarıdaki resimde kutucuk içinde 0 görünen değeri istediğimiz gibi saniye bazında değiştirebiliriz.

indirect checkpoint3

Yukarıdaki işlemi GUI aracılığıyla yani SSMS aralığıyla yapabileceğimiz gibi veritabanı özelliklerini değiştirebileceğimiz ALTER DATABASE komutu ile de aşağıdaki gibi yapabiliriz.

ALTER DATABASE [DATABASE ADI]

SET TARGET_RECOVERY_TIME = deger { SECONDS | MINUTES }

ALTER DATABASE AdventureWorks2008R2

SET TARGET_RECOVERY_TIME = 10 SECONDS;

Indirect Checkpoint özelliğinin kullanılması bizim Recovery time dediğimiz süreyi kısalttığı için yararlı olabilir fakat aynı zamanda her güzel şey gibi bu özelliğinde dezavantajları vardır. Target Recovery Time (Seconds)  parametresinin değerini ne kadar kısa tutarsak o sıklıkla veriler bellekten data dosyalarına yani Disklere taşınacaktır bu da sistemimizdeki I/O değerinin yükselmesine ve dolayısıyla performans kaybına sebep olacaktır. Bu nedenle böyle ciddi bir değeri Production ortamlarında değiştirmeden önce kesinlikle Development veya test ortamlarında test edilmelidir.

Son olarak gerçekten ciddi anlamda yarar sağlayabilecek Enterprise seviyedeki bu özelliği SQL Serverın sadece Enterprise sürümünde değil diğer sürümlerinde de kullanabilirsiniz.

 

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>