Sorgu Deposu ile performansı izleme

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Veritabanı - Esnek Sunucu

Esnek PostgreSQL için Azure Veritabanı sunucudaki Sorgu Deposu özelliği, zaman içinde sorgu performansını izlemenin bir yolunu sağlar. Sorgu Deposu, en uzun süre çalışan ve en yoğun kaynak kullanan sorguları hızla bulmanıza yardımcı olarak performans sorunlarını gidermeyi basitleştirir. Sorgu Deposu sorguların ve çalışma zamanı istatistiklerinin geçmişini otomatik olarak yakalar ve bunları gözden geçirmeniz için saklar. Zamansal kullanım desenlerini görebilmeniz için verileri zamana göre dilimler. Tüm kullanıcılar, veritabanları ve sorgular için veriler, PostgreSQL için Azure Veritabanı esnek sunucu örneğinde azure_sys adlı bir veritabanında depolanır.

Önemli

azure_sys veritabanını veya şemasını değiştirmeyin. Bunu yaptığınızda Sorgu Deposu ve ilgili performans özelliklerinin düzgün çalışması engellenir.

Sorgu Deposunu Etkinleştirme

Sorgu Deposu ek ücret ödemeden tüm bölgelerde kullanılabilir. Bu bir kabul etme özelliğidir, bu nedenle bir sunucuda varsayılan olarak etkinleştirilmez. Sorgu deposu, belirli bir sunucudaki tüm veritabanları için genel olarak etkinleştirilebilir veya devre dışı bırakılabilir ve veritabanı başına açılamaz veya kapatılamaz.

Önemli

Performans etkisine neden olacağından, Sorgu Deposu'yu Ani Artırılabilir fiyatlandırma katmanında etkinleştirmeyin.

Azure portalında Sorgu Deposu'yu etkinleştirme

  1. Azure portalında oturum açın ve PostgreSQL için Azure Veritabanı esnek sunucu örneğinizi seçin.
  2. Menünün Ayarlar bölümünde Sunucu parametreleri'ni seçin.
  3. parametresini pg_qs.query_capture_mode arayın.
  4. En üst düzey sorguları mı yoksa iç içe sorguları mı (bir işlev veya yordam içinde yürütülenler) izlemek istediğinize bağlı olarak değerini TOP veya ALLolarak ayarlayın ve Kaydet'e tıklayın. İlk toplu iş verilerinin azure_sys veritabanında kalıcı olması için 20 dakikaya izin verin.

Sorgu Deposu Bekleme Örneklemesini Etkinleştirme

  1. parametresini pgms_wait_sampling.query_capture_mode arayın.
  2. Değeri ve Kaydet olarak ALL ayarlayın.

Sorgu Deposu'ndaki bilgiler

Sorgu Deposu iki depodan oluşur:

  1. Sorgu yürütme istatistikleri bilgilerini kalıcı hale getiren çalışma zamanı istatistikleri deposu.
  2. Bekleme istatistikleri bilgilerini kalıcı hale getiren bir bekleme istatistikleri deposu.

Sorgu Deposu'yu kullanmaya yönelik yaygın senaryolar şunlardır:

  • Belirli bir zaman penceresinde bir sorgunun kaç kez yürütüldü olduğunu belirleme.
  • Büyük deltaları görmek için zaman pencereleri arasında bir sorgunun ortalama yürütme süresini karşılaştırma.
  • Son birkaç saat içinde en uzun süre çalışan sorguları tanımlama.
  • Kaynakları bekleyen en iyi N sorgularını tanımlama.
  • Anlamak, belirli bir sorgu için doğayı bekler.

Alan kullanımını en aza indirmek için, çalışma zamanı istatistikleri deposundaki çalışma zamanı yürütme istatistikleri sabit, yapılandırılabilir bir zaman penceresi üzerinde toplanır. Bu depolardaki bilgiler görünümler kullanılarak sorgulanabilir.

Sorgu Deposu bilgilerine erişme

Sorgu Deposu verileri, PostgreSQL için Azure Veritabanı esnek sunucu örneğinizdeki azure_sys veritabanında depolanır. Aşağıdaki sorgu, Sorgu Deposu'ndaki sorgular hakkında bilgi döndürür:

SELECT * FROM  query_store.qs_view;

Ya da bekleme istatistikleri için bu sorgu:

SELECT * FROM  query_store.pgms_wait_sampling_view;

Bekleme sorgularını bulma

Bekleme olayı türleri, farklı bekleme olaylarını benzerliğe göre demetler halinde birleştirir. Sorgu Deposu bekleme olayı türünü, belirli bir bekleme olayı adını ve söz konusu sorguyu sağlar. Bu bekleme bilgilerini sorgu çalışma zamanı istatistikleriyle ilişkilendirebilmek, sorgu performansı özelliklerine nelerin katkıda bulunabileceğini daha iyi anlayabileceğiniz anlamına gelir.

Sorgu Deposu'ndaki bekleme istatistiklerini kullanarak iş yükünüzle ilgili daha fazla içgörü elde etmek için kullanabileceğiniz bazı örnekler aşağıda verilmiştir:

Gözlem Eylem
Yüksek Kilit beklemeleri Etkilenen sorgular için sorgu metinlerini denetleyin ve hedef varlıkları belirleyin. Sık yürütülen ve/veya süresi yüksek olan aynı varlığı değiştiren diğer sorguları Sorgu Deposu'na bakın. Bu sorguları tanımladıktan sonra eşzamanlılığı geliştirmek için uygulama mantığını değiştirmeyi veya daha az kısıtlayıcı bir yalıtım düzeyi kullanmayı göz önünde bulundurun.
Yüksek Arabellekli GÇ beklemeleri Sorgu Deposu'nda çok sayıda fiziksel okuma içeren sorguları bulun. Yüksek GÇ beklemeleri olan sorgularla eşleşiyorsa, taramalar yerine arama yapmak için temel alınan varlığa bir dizin eklemeyi göz önünde bulundurun. Bu, sorguların GÇ yükünü en aza indirir. Bu sunucu için sorguları en iyi duruma getirebilecek dizin önerileri olup olmadığını görmek için portalda sunucunuzun Performans Öneriler denetleyin.
Yüksek Bellek beklemeleri Sorgu Deposu'nda en çok bellek tüketen sorguları bulun. Bu sorgular büyük olasılıkla etkilenen sorguların ilerleme durumunu geciktiriyor. Bu sorguları en iyi duruma getirebilecek dizin önerileri olup olmadığını görmek için portalda sunucunuzun Performans Öneriler denetleyin.

Yapılandırma seçenekleri

Sorgu Deposu etkinleştirildiğinde, verileri sunucu parametresi tarafından pg_qs.interval_length_minutes belirlenen uzunluktaki toplama pencerelerine kaydeder (varsayılan olarak 15 dakikadır). Her pencere için pencere başına 500 ayrı sorgu depolar. Sorgu Deposu parametrelerini yapılandırmak için aşağıdaki seçenekler kullanılabilir:

Parametre Açıklama Varsayılan Aralık
pg_qs.query_capture_mode Hangi deyimlerin izlendiğini ayarlar. yok none, top, all
pg_qs.interval_length_minutes (*) pg_qs için query_store yakalama aralığını dakika cinsinden ayarlar. Bu, veri kalıcılığının sıklığıdır. 15 1 - 30
pg_qs.store_query_plans pg_qs için sorgu planlarını kaydetmeyi açar veya kapatır. kapalı açık, kapalı
pg_qs.max_plan_size pg_qs için sorgu planı metni için kaydedilecek en fazla bayt sayısını ayarlar; daha uzun planlar kesilir. 7.500 100 - 10k
pg_qs.max_query_text_length Kaydedilebilecek en fazla sorgu uzunluğunu ayarlar; daha uzun sorgular kesilir. 6000 100 - 10K
pg_qs.retention_period_in_days Saklama süresi penceresini pg_qs için gün cinsinden ayarlar; bu sürenin ardından veriler silinir. 7 1 - 30
pg_qs.index_generation_interval (*) pg_qs için query_store dizini otomatik oluşturma aralığını dakika cinsinden ayarlar. 720 15 - 10080
pg_qs.index_recommendations Dizin önerilerini etkinleştirir veya devre dışı bırakır. pg_qs.query_capture_mode da 'TOP' veya 'ALL' olmalıdır. kapalı kapalı, öneri
pg_qs.track_utility Yardımcı program komutlarının pg_qs tarafından izlenip izlenmediğini ayarlar. on açık, kapalı

(*) Değerindeki değişikliğin etkili olması için sunucunun yeniden başlatılmasını gerektiren statik sunucu parametresi.

Aşağıdaki seçenekler özellikle bekleme istatistikleri için geçerlidir:

Parametre Açıklama Varsayılan Aralık
pgms_wait_sampling.query_capture_mode pgms_wait_sampling uzantısı tarafından hangi deyimlerin izlendiğini seçer. yok hiçbiri, tümü
Pgms_wait_sampling.history_period Bekleme olaylarının örneklendiği sıklığı milisaniye cinsinden ayarlar. 100 1-600000

Not

pg_qs.query_capture_mode, pgms_wait_sampling.query_capture_mode değerinin yerini alır. pg_qs.query_capture_mode NONE ise, pgms_wait_sampling.query_capture_mode ayarının hiçbir etkisi yoktur.

Bir parametre için farklı bir değer almak veya ayarlamak için Azure portalını kullanın.

Görünümler ve işlevler

Aşağıdaki görünümleri ve işlevleri kullanarak Sorgu Deposu'na bakın ve yönetin. PostgreSQL genel rolündeki herkes bu görünümleri kullanarak Sorgu Deposu'ndaki verileri görebilir. Bu görünümler yalnızca azure_sys veritabanında kullanılabilir.

Sorgular, yapılarına bakarak ve değişmez değerler, sabitler, diğer adlar veya büyük/küçük harf farklılıkları gibi anlamlı olmayan herhangi bir şeyi yoksayarak normalleştirilir.

İki sorgu, aynı başvuruda bulunılan sütunlar ve tablolar için farklı diğer adlar kullansalar bile, aynı query_id ile tanımlanır. İki sorgu yalnızca içinde kullanılan değişmez değerlerden farklıysa, aynı query_id ile de tanımlanırlar. Aynı query_id ile tanımlanan tüm sorgular için sql_query_text, Sorgu Deposu etkinliği kaydetmeye başladığından veya kalıcı veriler son atıldığından beri yürütülen sorgunun query_store.qs_reset işlevi yürütülür.

Sorgu normalleştirme nasıl çalışır?

Aşağıda, bu normalleştirmenin nasıl çalıştığını göstermeye çalışan bazı örnekler verilmiştir:

Aşağıdaki deyimle bir tablo oluşturduğunuzu varsayalım:

create table tableOne (columnOne int, columnTwo int);

Sorgu Deposu veri toplamayı etkinleştirirsiniz ve tek veya birden çok kullanıcı aşağıdaki sorguları tam olarak şu sırayla yürütür:

select * from tableOne;
select columnOne, columnTwo from tableOne;
select columnOne as c1, columnTwo as c2 from tableOne as t1;
select columnOne as "column one", columnTwo as "column two" from tableOne as "table one";

Önceki tüm sorgular aynı query_id paylaşır. Sorgu Deposu'nun sakladığı metin, veri toplamayı etkinleştirdikten sonra yürütülen ilk sorgunun metnidir. Bu nedenle, olacaktır select * from tableOne;.

AŞAĞıDAKI sorgu kümesi normalleştirildikten sonra önceki sorgu kümesiyle eşleşmiyor çünkü WHERE yan tümcesi onları birbirinden farklı yapıyor:

select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;
select * from tableOne where columnOne = -3 and columnTwo = -3;
select columnOne, columnTwo from tableOne where columnOne = '5' and columnTwo = '5';
select columnOne as "column one", columnTwo as "column two" from tableOne as "table one" where columnOne = 7 and columnTwo = 7;

Ancak, bu son kümedeki tüm sorgular aynı query_id paylaşır ve bunların tümünü tanımlamak için kullanılan metin, toplu işteki select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;ilk sorgunun metnidir.

Son olarak, önceki toplu iştekilerin query_id eşleşmeyen bazı sorguları ve neden eşleşmeme nedenlerini aşağıda bulabilirsiniz:

Sorgu:

select columnTwo as c2, columnOne as c1 from tableOne as t1 where columnOne = 1 and columnTwo = 1;

Eşleşmeme nedeni: Sütun listesi aynı iki sütuna (columnOne ve ColumnTwo) başvurur, ancak başvurulan sıra önceki toplu işlemden columnOne, ColumnTwo bu sorgudakine ColumnTwo, columnOne tersine çevrilir.

Sorgu:

select * from tableOne where columnTwo = 25 and columnOne = 25;

Eşleşmeme nedeni: WHERE yan tümcesinde değerlendirilen ifadelerin başvurulacağı sıra, önceki toplu işten bu sorgudakine ColumnTwo = ? and columnOne = ? tersine çevrilircolumnOne = ? and ColumnTwo = ?.

Sorgu:

select abs(columnOne), columnTwo from tableOne where columnOne = 12 and columnTwo = 21;

Eşleşmeme nedeni: Sütun listesindeki ilk ifade artık değilcolumnOne, () üzerinden columnOneabs(columnOne)değerlendirilen işlevdir abs ve bu da sematik olarak eşdeğer değildir.

Sorgu:

select columnOne as "column one", columnTwo as "column two" from tableOne as "table one" where columnOne = ceiling(16) and columnTwo = 16;

Eşleşmeme nedeni: WHERE yan tümcesindeki ilk ifade artık bir değişmez değerle eşitliğini columnOne değerlendirmez, ancak işlevin ceiling sonucu bir değişmez değer üzerinden değerlendirilir ve bu da sematik olarak eşdeğer değildir.

Görünümler

query_store.qs_view

Bu görünüm, Sorgu Deposu'nun destekleyici tablolarında zaten kalıcı olan tüm verileri döndürür. Şu anda etkin olan zaman penceresi için bellek içinde kaydedilen veriler, zaman penceresi sona erene ve bellek içi geçici verileri toplanana ve diskte depolanan tablolarda kalıcı hale gelene kadar görünmez. Bu görünüm, her ayrı veritabanı (db_id), kullanıcı (user_id) ve sorgu (query_id) için farklı bir satır döndürür.

Ad Tür Başvurular Açıklama
runtime_stats_entry_id bigint runtime_stats_entries tablosundaki kimlik.
user_id Oıd pg_authid.oid deyimini yürüten kullanıcının OID'i.
Db_ıd Oıd pg_database.oid deyiminin yürütüldiği veritabanının OID'sini.
query_id bigint deyiminin ayrıştırma ağacından hesaplanan iç karma kodu.
query_sql_text varchar(10000) Temsili açıklama metni. Aynı yapıya sahip farklı sorgular birlikte kümelenir; bu metin, kümedeki sorgulardan ilkinin metnidir. Maksimum sorgu metni uzunluğu için varsayılan değer 6000'dir ve sorgu deposu parametresi pg_qs.max_query_text_lengthkullanılarak değiştirilebilir. Sorgu metni bu en yüksek değeri aşarsa, ilk pg_qs.max_query_text_length karakterlere yuvarlanır.
plan_id bigint Bu sorguya karşılık gelen planın kimliği.
start_time timestamp Sorgular, zaman aralığı sunucu parametresi pg_qs.interval_length_minutes tarafından tanımlanan zaman pencerelerine göre toplanır (varsayılan değer 15 dakikadır). Bu, bu girişin zaman penceresine karşılık gelen başlangıç saatidir.
end_time timestamp Bu girişin zaman penceresine karşılık gelen bitiş saati.
Aramalar bigint Sorgunun bu zaman penceresinde kaç kez yürütüldü? Paralel sorgular için, her yürütmeye yönelik çağrı sayısının sorgunun yürütülmesini sağlayan arka uç işlemi için 1'e karşılık geldiğini ve yürütme ağacının paralel dallarını yürütmek için başlatılan her arka uç çalışan işlemi için diğer birçok birimin gösterildiğine dikkat edin.
total_time çift duyarlık Milisaniye cinsinden toplam sorgu yürütme süresi.
min_time çift duyarlık Milisaniye cinsinden en düşük sorgu yürütme süresi.
max_time çift duyarlık Milisaniye cinsinden en fazla sorgu yürütme süresi.
mean_time çift duyarlık Milisaniye cinsinden ortalama sorgu yürütme süresi.
stddev_time çift duyarlık Sorgu yürütme süresinin milisaniye cinsinden standart sapması.
satırlar bigint Deyiminden alınan veya etkilenen toplam satır sayısı. Paralel sorgular için, her yürütmenin satır sayısının sorgunun yürütülmesini sağlayan arka uç işlemi tarafından istemciye döndürülen satır sayısına, ayrıca yürütme ağacının paralel dallarını yürütürken işbirliği yapmak için başlatılan her arka uç çalışan işleminin başlattığı tüm satırların toplamına karşılık geldiğini ve bu satırların, sürüş arka uç işlemine geri döndüğüne dikkat edin.
shared_blks_hit bigint deyimi tarafından paylaşılan blok önbelleği isabetlerinin toplam sayısı.
shared_blks_read bigint deyimi tarafından okunan toplam paylaşılan blok sayısı.
shared_blks_dirtied bigint deyimi tarafından kirlenen toplam paylaşılan blok sayısı.
shared_blks_written bigint Deyimi tarafından yazılan toplam paylaşılan blok sayısı.
local_blks_hit bigint deyimi tarafından yapılan yerel blok önbelleği isabetlerinin toplam sayısı.
local_blks_read bigint deyimi tarafından okunan toplam yerel blok sayısı.
local_blks_dirtied bigint deyimiyle kirlenen yerel blokların toplam sayısı.
local_blks_written bigint deyimi tarafından yazılan toplam yerel blok sayısı.
temp_blks_read bigint Deyimi tarafından okunan geçici blokların toplam sayısı.
temp_blks_written bigint Deyimi tarafından yazılan toplam geçici blok sayısı.
blk_read_time çift duyarlık Deyimin okuma bloklarını harcadığı toplam süre (milisaniye cinsinden (track_io_timing etkinleştirilirse, aksi takdirde sıfır).
blk_write_time çift duyarlık Deyimin blokları yazmak için harcadığı toplam süre (milisaniye cinsinden (track_io_timing etkinleştirilirse, aksi takdirde sıfır).
is_system_query boolean Sorgunun süper kullanıcı ayrıcalıklarına sahip olan ve denetim bölmesi işlemlerini gerçekleştirmek için kullanılan user_id = 10 (azuresu) ile rol tarafından yürütülmüş olup olmadığını belirler. Bu hizmet yönetilen bir PaaS hizmeti olduğundan, yalnızca Microsoft bu süper kullanıcı rolünün bir parçasıdır.
query_type text Sorgu tarafından temsil edilen işlemin türü. Olası değerler : , , , , , , merge, utility, nothingundefined. deleteinsertupdateselectunknown

query_store.query_texts_view

Bu görünüm, Sorgu Deposu'ndaki sorgu metin verilerini döndürür. Her ayrı query_sql_text için bir satır vardır.

Ad Tür Açıklama
query_text_id bigint query_texts tablosunun kimliği
query_sql_text varchar(10000) Temsili açıklama metni. Aynı yapıya sahip farklı sorgular birlikte kümelenir; bu metin, kümedeki sorgulardan ilkinin metnidir.
query_type smallint Sorgu tarafından temsil edilen işlemin türü. PostgreSQL <= 14 sürümünde olası değerler (bilinmeyen), (seç), 1 (güncelleştirme), 32 (ekle), (sil), 4 (yardımcı program) 5 (hiçbir şey) 6 şeklindedir 0 . PostgreSQL >= 15 sürümünde olası değerler (bilinmeyen), (seç), 1 (güncelleştirme), 32 (ekle), (sil), 4 (birleştirme), 5 (yardımcı program), 67 (hiçbir şey) şeklindedir 0 .

query_store.pgms_wait_sampling_view

Bu görünüm Sorgu Deposu'ndaki bekleme olayları verilerini döndürür. Bu görünüm her ayrı veritabanı (db_id), kullanıcı (user_id), sorgu (query_id) ve olay (olay) için farklı bir satır döndürür.

Ad Tür Başvurular Açıklama
start_time timestamp Sorgular, zaman aralığı sunucu parametresi pg_qs.interval_length_minutes tarafından tanımlanan zaman pencerelerine göre toplanır (varsayılan değer 15 dakikadır). Bu, bu girişin zaman penceresine karşılık gelen başlangıç saatidir.
end_time timestamp Bu girişin zaman penceresine karşılık gelen bitiş saati.
user_id Oıd pg_authid.oid deyimini yürüten kullanıcının OID'i.
Db_ıd Oıd pg_database.oid deyiminin yürütüldiği veritabanının OID'sini.
query_id bigint deyiminin ayrıştırma ağacından hesaplanan iç karma kodu.
Event_type text Arka ucun beklediği olay türü.
event text Arka uç şu anda bekliyorsa bekleme olayı adı.
Aramalar integer Aynı olayın yakalanma sayısı.

Not

query_store.pgms_wait_sampling_view görünümünün event_type ve olay sütunlarındaki olası değerlerin listesi için pg_stat_activity resmi belgelerine bakın ve aynı adlara sahip sütunlara başvuran bilgileri arayın.

query_store.query_plans_view

Bu görünüm, sorguyu yürütmek için kullanılan sorgu planını döndürür. Her ayrı veritabanı kimliği ve sorgu kimliği başına bir satır vardır. Bu, yalnızca yardımcı olmayan sorgular için sorgu planlarını depolar.

plan_id Db_ıd query_id plan_text
plan_id bigint EXPLAIN tarafından üretilen normalleştirilmiş sorgu planındaki karma değer. Plan düğümlerinin tahmini maliyetlerini ve arabellek kullanımını dışladığı için normalleştirilmiş olarak kabul edilir.
Db_ıd Oıd pg_database.oid deyiminin yürütüldiği veritabanının OID'sini.
query_id bigint deyiminin ayrıştırma ağacından hesaplanan iç karma kodu.
plan_text varchar(10000) verilen costs=false, buffers=false ve format=text deyiminin yürütme planı. Bu, EXPLAIN tarafından verilen çıkışla aynıdır.

İşlevler

query_store.qs_reset

Bu işlev, Sorgu Deposu tarafından bugüne kadar toplanan tüm istatistikleri atar. Hem disk tablolarında kalıcı olan kapalı zaman pencereleri hem de hala bellekte tutulan geçerli zaman penceresi için istatistikleri atar. Bu işlev yalnızca sunucu yöneticisi rolü (azure_pg_admin) tarafından yürütülebilir.

query_store.staging_data_reset

Bu işlev, Sorgu Deposu tarafından bellek içinde toplanan tüm istatistikleri atar (başka bir ifadeyle, sorgu deposu için toplanan verilerin kalıcılığını destekleyen disk tablolarında henüz boşaltılmamış olan bellekteki veriler). Bu işlev yalnızca sunucu yöneticisi rolü (azure_pg_admin) tarafından yürütülebilir.

Salt okunur mod

bir PostgreSQL için Azure Veritabanı - Esnek Sunucu örneği salt okunur moddaykendefault_transaction_read_only, örneğin parametresi olarak ayarlandığında onveya depolama kapasitesine ulaşıldığında salt okunur mod otomatik olarak etkinleştirilirse Sorgu Deposu hiçbir veri yakalamaz.