MSSQL Server Query Store Nedir

Bu makalede Sql Server’ın bize sunmuş olduğu Query Store yapısını ele almış olacağız. Şimdi detaylı bir şekilde bu yapının ne olduğu, nasıl aktif edildiği ve parametrelerinin ne olduğunu detaylı bir şekilde ele almış olacağız.

Query Store  Asenkron bir şekilde çalışır ve sisteme herhangi bir yük getirmez.

Query Store yapısı veritabanı bazlı çalışan ve veritabanına gelen sorgulara ait geçmiş bilgileri tutan bir yapı olarak karşımıza çıkmaktadır. Geçmiş dediğimiz kavram sorguların execution planını, okuma yazma bilgilerini, cpu tüketimini, istatistik bilgilerini, hangi sorgunun ne kadar kullanıldığını ve bunun gibi birden fazla işlem için kullanabiliriz.

Veritabanı üzerinde yapılan bazı değişiklikler sorgumuzun zamanla execution planının değişmesine sebebiyet verebilir. Eğer sorgularınızın veritabanından geç cevap alındığına dair bir geri dönüş size varsa bu yapı aktif hale getirilerek sorunu tespit edip sorgularımızı daha hızlı bir yapıya dönüştürebiliriz.

Önemli Not: High Availability yapılarında  biri olan AlwaysOn sisteminde eğer Query Store kullanıyorsanız sisteminin herhangi bir failover anında ikinci sunucuda geç ayağa kalkmasına sebep olabilir. Çünkü  Query Store aktif olan veritabanı ikinci sunucuda da aynı yapıya gelmek isteyecek bunun için bu bilgiler ikinci sunucuda veritabanının çok geç ayağa kalkmasına sebebiyet verebilir.  Traceflag  T7752  failover durumunda query store daki verilerin restoresinin önüne geçer. Dikkat edilemesi gereken bir konudur.

Aşağıdaki komut ile bir veritabanından Query Store yapısının açık olup olmadığını görebiliriz.

select name ,is_query_store_on from sys.databases where is_query_store_on=1

Bu özelliğin aktif edilmesi için veritabanı üzerine sağ tıklanır ve properties kısmına girilir.

Gelen ekranda en altta bulunan Query Store  bölümüne tıklanır. Tüm ön konfigürasyonlar bu ekrandan yapılmaktadır.

Şimdi yukarıdaki bölümlerin en iş yaptığını açıklayalım.

Operation Mode kısmında 3 seçenek karşımıza çıkmaktadır. Biz veritabanı üzerinde hem okunan hem de insert edilen değerlere ait bilgileri toplamak istediğimiz için Read write seçeneği seçilmektedir.

Read write  seçtikten sonra diğer bölümleri default değerlerde bırakmak bile yeterli bence. Sadece yoğun bir sistem kullanıyorsanız Stale Query Threshold kısmında kaydedilen verilerin ne kadar süre sonra kaydedilmemesi gerektiğini belirleyebiliriz. Bu değerin uzun tutulması Max size bölümünde vermiş olduğumuz query store alanının dolmasına sebep olacak Operation Mode otomatik olarak Read only moda geçecektir.  Bu yüzden Stale Query Threshold değerinin 3-5 günlük bir değer verilmesi tercih edilmektedir.

Data Flush kısmında ki değer de toplanan verinin ne sıklıkla diske yazıldığını belirtir. Makalenin başında da belirttiğim gibi Query Store  Asenkron bir şekilde çalışır ve sisteme herhangi bir yük getirmez.

Statistics Collection Interval: İstatistikleri toplama aralığıdır. Daha düşük bir değer set edilmesi sorunumuzu kısa sürede bulmamıza yardımcı olabilir.

Query Store Capture Mode kısmı, query store’un hangi sorguları yakalayacağını belirler. All tüm sorguların kaydedileceği, none ifadesi hiçbir sorguyu yakalamaz. Sık gelen sorguların sadece yakalanmasını istiyorsak auto seçeneği seçilmelidir.

Size Based Cleanup Mode kısmında, max size limitine yaklaşıldığında otomatik veri temizlemenin otomatik olarak çalışıp çalışmayacağını belirleriz. Default olarak Auto gelir ve böyle bırakmamız tavsiye ediliyor.

Tüm bu değişiklikleri yaptıktan sonra OK tuşuna basarak veya  sol üst tarafta bulunan script kısmına tıklayarak script’ini alabiliriz.

Aşağıdaki resimde Current Disk Usage kısmında sol kısımda bulunan Mavi daire bizim database’in boyutunu sağ taraftaki daire ise Query Store boyutunu göstermektedir. Sağ alt tarafta bulunan Purge Query Data kısmında ise Query Store yapısında  bulunan tüm verileri silebiliriz.

Query Store aktif edilmiş veritabanı altında bu yapının tüm işlemlerini görebiliriz.

Regressed Queries (Gerileyen Sorgular): Daha önce iyi performans gösteren ancak zaman içinde performansı düşen sorguları listeler. Performansı düşen sorguları tespit edip, bu sorguları optimize etmek için kullanılır.

Overall Resource Consumption (Genel Kaynak Tüketimi):Veritabanındaki tüm sorguların kaynak tüketimini (CPU, bellek, I/O vb.) genel olarak gösterir. Hangi sorguların en fazla kaynak tükettiğini anlamak ve kaynak kullanımını optimize etmek için kullanılır.

Top Resource Consuming Queries (En Fazla Kaynak Tüketen Sorgular): En fazla CPU, bellek veya I/O kaynağı tüketen sorguları listeler. Performans sorunlarına neden olan sorguları belirlemek ve bu sorguları optimize etmek için kullanılır.

Queries With Forced Plans (Zorlanmış Planları Olan Sorgular): SQL Server tarafından belirli bir yürütme planına zorlanmış sorguları listeler. Zorlanmış planların performansını izlemek ve gerekirse bu planları değiştirmek için kullanılır.

Queries With High Variation (Yüksek Varyasyon Gösteren Sorgular): Farklı yürütme süreleri veya kaynak tüketimleri gösteren sorguları listeler. Tutarsız performans gösteren sorguları tespit edip, bu sorguları optimize etmek için kullanılır.

Query Wait Statistics (Sorgu Bekleme İstatistikleri): Sorguların hangi kaynaklar için beklediğini (örneğin, CPU, disk I/O, kilitlenmeler) gösterir. Sorguların neden yavaş çalıştığını anlamak ve bu sorunları gidermek için kullanılır.

Tracked Queries (İzlenen Sorgular): Belirli sorguların performansını izlemek için kullanılır. Özellikle kritik sorguların performansını sürekli olarak takip etmek ve bu sorguları optimize etmek için kullanılır.

Query Store altında bulunan regressed queries sorguların en iyi çalışma zamanının  göstermektedir. Burada dikkat edersek Plan id 208 olan sorgunun en iyi query planını altta bulunan Force Plan seçeneği ile şartlayabiliriz. Daha önce iyi performans gösteren ancak zaman içinde performansı düşen sorguları listelemektedir.

Burada istenilen bilgiyi görmek için farklı seçenekler ayarlanabilir. Örneğin, hem grafik yerine hem de tarihi görmek istiyorsanız, sorguları ızgara formatında gösterme düğmesine basabiliriz. Dikkat ederseniz her sorgunun execution planını geçmiş plan özetini tüm seçenekleri görmek mümkün. Tüm detayların incelenmesi gerekiyor.

Query Store altında  ikinci seçenekte bulunan overall resource consumption ile genel kaynak tüketimi görebiliriz. Genel Kaynak Tüketimi yerleşik raporu, belirli bir zaman aralığı boyunca özet kaynak tüketimini gösterir. Varsayılan olarak, sonuçlar geçen aya ait olup dört grafikte gösterilir: Süre, CPU Süresi, Mantıksal Okumalar ve Yürütme sayısını göstermektedir.

Bu ekranda kendi bakmak istediğimiz özel değerlere göre ekranın gelmesini istiyorsak sağ üst köşede Configure diyerek belirlediğimiz kısmın yukarıdaki ekrana gelmesini sağlayabiliriz.

Query Store altında  üçüncü seçenekte bulunan top resource consuming queries en çok kaynak tüketen sorgular görülmektedir. Bu kısımda en çok kaynak tüketen 25 sorguyu görebiliriz.

Query Store altında  dördüncü seçenekte bulunan queries with forced plans ise önceden zorunlu planlanmış sorguları göstermektedir. Zorunlu kılınmış planları kaldırmak için aşağıdaki resimde de görüldüğü gibi ilgili plan üzerine gelip sağ alt köşede  Unforce Plan dememiz yeterli olacaktır.

SQL Server’ı belirli bir sorgu için belirli bir Yürütme Planını kullanmaya zorlamak için ilgili sorgu planının üzerine gelip Force plan diyebiliriz.

Onay mesajı kutusundaki Evet düğmesine basıp işlemleri onaylıyorum.

Bu force plandan sonra Sql Server artık bu planı kullanır. Başka bir plan kullanmayı tercih etmez.

Query Store altında  beşinci  seçenekte bulunan queries with high variation yüksek değişkenliğe sahip parametreli sorguları göstermektedir.

Query Store altında  son  seçenekte bulunan tracked queries belirlenen bir sorgunun query planının  zaman içerisinde nasıl değiştiğini gözlemleyebiliriz.

Query store özelliği açılmış olan bir veritabanında en iyi ön izleme nasıl yapılır. Öncelikle herhangi bir sorgumuzun perfomansı zamanla bozuluyorsa bu sorgu için gerekli olan istatistik ve index yapısına bakılıp öyle karar verilmesi gerekmektedir. Herhangi bir plana sorgumuzu force ettiğimizde sorgu bu plan dahilinde çalışır ama manuel müdahale ettiğimiz için sql server zamanla önceki planımızın daha iyi olduğuna karar verebilir. Force etmede bir sakınca yoktur aslında sql server bize en iyi planları önümüze getirmektedir. Sorgumuzun plan handle değerine baktığımızda parameter sniffing olabilir. Bu sefer ilgili planın silinip tekrardan plan oluşturulması gerekmektedir.

Bu makalede Query Store Yapısını ele almış olduk. Başka bir makalede görüşmek dileğiyle.

“Allah (inkarcılara) “Yeryüzünde kaç sene kaldınız?” diye sorar. Onlar, “Bir gün, ya da bir günden daha az bir süre kaldık. Hesap tutanlara sor” derler. Allah şöyle der: “Çok az bir zaman kaldınız. Keşke bunu (daha önce) bilmiş olsaydınız.””  Mü’minûn 112-114

Author: Yunus YÜCEL

1 thought on “MSSQL Server Query Store Nedir

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir