Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

SQL Server 2016 – Query Store

Merhaba,

SQL Server, çalıştırılan sorguların çalışma esnasında oluşturulan Execution Plan’larını Memory’de Plan Cache diye nitelendirdiğimiz bir alanda kaydetmektedir. Bu Plan Cache üzerinde bulunan Execution Plan’ların bazı durumlarda silinme ihtimaline karşı SQL Server 2016 ile gelen Query Store özelliği ile bu Plan Cache alanını logluyoruz ve görsel bir arayüz vasıtasıyla önceki Execution Plan’ları görebiliyoruz ve hatta sorgumuzu istediğimiz planda çalıştırabiliyoruz. Hadi gelin bu Query Store özelliğinin getirdiği nimetleri ve nasıl kullanıldığını detaylandıralım.

SQL Server’da herhangi bir sorguyu çalıştırdığımız esnada direkt olarak sonuçları elde etsekte aslında arkaplanda çalışma anında yapılan öncelikli işlemler vardır. Bu işlemler sırasıyla;

  1. Parse İşlemi
    Yazılan SQL sorgusunun gramer olarak doğru mu? yanlış mı? olduğuna bakılır.
  2. Binding İşlemi
    Sorgudaki objeler SQL Server’da var mı? yok mu? kontrol edilir.
  3. Execution İşlemi
    Sorgunun maliyetine ve performansına göre Execution Plan seçilir.

Sorgu ilk çalıştırıldığında Execution Plan oluşturmak ekstra bir yük ve performans gerektirdiği için yukarılarda da bahsettiğimiz gibi oluşturulan Execution Plan’lar Plan Cache denen Memory alanına kaydedilmektedirler. Haliyle var olan Execution Plan, yeniden oluşturulmaya nazaran tercih edilmektedir.

Plan Cache üzerinde bulunan performanslı, düşük maliyetli ve en optimum seviyedeki bir Execution Plan bazen ister istemez değişebilmektedir. Hatta yeni Execution Plan bir öncekine nazaran daha az performans ve yüksek maliyette olabilir.

Peki bu değişikliğin sebepleri nelerdir?

  • Bazı durumlarda SQL Server tarafından Execution Plan’lar silinir ve tekrar hesaplanır,
  • Execution Plan’ın kullandığı istatistik objesinin güncellenmesi gerçekleşebilir,
  • Yeni bir index oluşturulmuş olabilir,
  • Execution Plan’ın kullandığı indeksi silmesi yahut güncellemesi olabilir,
  • SQL Server’ın restart edilmesi olabilir.

vs.. vs…

İşte bu saydığımız olası sebeplerden dolayı optimum Execution Plan’ımızı kaybetmemeli, bir yerde kaydedebilmeli ve yeri ve zamanı gelince kullanabilmeliyiz. Bu işlemi SQL Server 2016 ile gelen Query Store özelliği ile yapabiliyoruz. Şimdi gelin bu özelliği nasıl kullanabileceğimizi inceleyelim.

Bu özelliği SQL Server Management Studio veya Transact SQL(T-SQL) programlama dili olmak üzere iki farklı şekilde de aktifleştirebilmekteyiz.

Öncelikle Management Studio üzerinden konuyu ele alalım.

SQL Server 2016 – Query Store

Veritabanımıza sağ tıklayarak “Properties” alanına tıklıyoruz.

Bu işlemden sonra karşımıza aşağıdaki ekran gelecektir.

SQL Server 2016 - Query Store

Yukarıdaki ekran görüntüsünü incelersek sol taraftaki “Select a page” menüsünden “(1)Query Store” kategorisine gelerek özelliğimizle ilgili bölüme geliyoruz. Bu bölümde “(2)General” kategorisindeki “Oparation Mode (Requested)” seçeneğini default olan”Off” değerinden “Read Write” olarak değiştirerek ilgili veritabanımızda Query Store özelliğini aktifleştirmiş oluyoruz.

Evet, artık Execution Plan’larımızın takibini net bir şekilde yapabilir, loglayabilir yahut görsel olarak izleyebiliriz. Tabi bu işlemlere gelmeden öncelikle şu yukarıdaki pencereyi tam olarak izah etmekte fayda var.

Hemen “(3)Monitoring” kategorisinden başlayalım. “Data Flush Interval (Minutes)” seçeneği ile Plan Cache içinde yapılan değişikliklerin ne sıklıkla kaydedileceğini dakika cinsinden ayarlıyoruz. Bu seçeneğe verilen değer performans ve maliyet açısından önem arz etmektedir. Nihayetinde verilen dakika periyodunda SQL Server asenkron bir şekilde Query Store için topladığı verileri kalıcı olması için diske yazacaktır. Aynı kategori altında “Statistics Collection Interval” seçeneği ise SQL Server’ın ne sıklıkla Query Store içindeki istatiksel verinin toplanacağını belirtmektedir. Data Flush Interval değerinde olduğu gibi bu değer içinde performans ve maliyet ön plandadır ve dakika, saat ve gün olmak üzere değer almaktadır.

Bir diğer kategorimiz olan “(4)Query Store Retention“‘a göz atalım. “Max Size (MB)” özelliği ile Query Store özelliğinin boyutunu, “Query Store Capture Mode” özelliği ile de hangi sorgulara ait bilgilerin loglanacağı belirtilmektedir ve “None”, “All” ve “Auto” parametrelerini almaktadır. “Stale Query Threshold (Days)” özelliği ise Query Store içindeki istatistiksel verilerin fiziksel olarak ne kadar süre saklanacağı gün cinsinden ayarlanmaktadır.

(5)Current Disk Usage” kısmında; sol tarafta ilgili veritabanının boyutunu, sağ tarafta ise Query Store’un kullandğı diskin alanının boyutunu görebilmekteyiz.

(6)Purge Query Data” butonu ile de Query Store tarafından depolanan tüm verileri silebiliriz.

Evet… Şimdi sıra Query Store özelliğini T-SQL ile aktifleştirmeye ve kullanmaya geldi.

Öncelikle veritabanımızda Query Store özelliğini aktifleştirelim.

ALTER DATABASE Northwind SET QUERY_STORE = ON

Bu şekilde Query Store aktifleştirilmekte lakin tüm özelliklere default değeri atanmaktadır. Eğer ki parametrelere default değer dışında veri girmek istiyorsanız aşağıdaki gibi bir çalışma gerçekleştirmelisiniz.

ALTER DATABASE Northwind SET QUERY_STORE = ON
(
	OPERATION_MODE = Read_Write,
	CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 365),
	DATA_FLUSH_INTERVAL_SECONDS = 1000,
	INTERVAL_LENGTH_MINUTES = 30,
	MAX_STORAGE_SIZE_MB = 250,
	QUERY_CAPTURE_MODE = AUTO,
	SIZE_BASED_CLEANUP_MODE = AUTO
)

Eğer ki veritabanınızda Query Store özelliği önceden aktifleştirilmişse aşağıdaki gibide çalışabilirsiniz.

ALTER DATABASE Northwind SET QUERY_STORE
(
	OPERATION_MODE = Read_Write,
	CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 365),
	DATA_FLUSH_INTERVAL_SECONDS = 1000,
	INTERVAL_LENGTH_MINUTES = 30,
	MAX_STORAGE_SIZE_MB = 250,
	QUERY_CAPTURE_MODE = AUTO,
	SIZE_BASED_CLEANUP_MODE = AUTO
)

Query Store özelliğini aktifleştirdikten sonra veritabanımıza göz atarsak eğer aşağıdaki gibi “Query Store” adında bir sekmenin açıldığını göreceğiz.
SQL Server 2016 - Query Store

Şimdi hazır Query Store özelliği aktifken aşağıdaki sorguyu çalıştıralım.

Select * from [Satis Detaylari] where SatisID > 10900

Sorguyu çalıştırdıktan sonra aşağıda görüldüğü üzere Query Store sekmesindeki “Top Resource Consuming Queries” bölümünü açınız.
SQL Server 2016 - Query Store

Açtıktan sonra aşağıdaki gibi bir ekranla karşılaşacaksınız.
SQL Server 2016 - Query Store

2. bölümde yazdığımız sorgumuza ait istatistikleri görmekteyiz. Buradaki istatistiklerin grafiksel ayarını 1. bölümdeki Metric ve Statistics kısmından yapabiliriz. 4. bölümde ise Query Store özelliği aktifken Execution Plan’ların istatistiklerini görebilmekteyiz. 3. bölümdeki butonlar vasıtasıyla Execution Plan’ları listeleyebilir, karşılaştırabilir yahut herhangi bir planı Force edebiliriz. 5. bölümde ise önceki makalelerimizde incelediğimiz o anki Execution Plan’ın detayını görmekteyiz.

Ayrıca dikkat ederseniz 2. bölümde “query id” alanı sorgunun sırasını, “exec count” alanı sorgunun kaç kere çalıştırıldığını ve “Total Duration” gelen satır sayısını vermektedir.

Gördüğünüz gibi “Query Store” özelliğinin nasıl konfigüre edildiğini ve çalıştırıldığını incelemiş olduk. Bunun dışında son olarak “Query Store” özelliğinin tüm verilerini silmek istiyorsak aşağıdaki sorgu işimizi görecektir.

ALTER DATABASE Northwind SET QUERY_STORE CLEAR ALL

Tabi ki de yukarılarda değindiğim gibi bu işlem için “Purge Query Data” butonunuda kullanabiliriz.

Bu yazımızında sonuna gelmiş bulunmaktayız. Umarım bol bol faydalanırsınız.
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir