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
- Azure portalında oturum açın ve PostgreSQL için Azure Veritabanı esnek sunucu örneğinizi seçin.
- Menünün Ayarlar bölümünde Sunucu parametreleri'ni seçin.
- parametresini
pg_qs.query_capture_mode
arayın. - 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
veyaALL
olarak 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
- parametresini
pgms_wait_sampling.query_capture_mode
arayın. - Değeri ve Kaydet olarak
ALL
ayarlayın.
Sorgu Deposu'ndaki bilgiler
Sorgu Deposu iki depodan oluşur:
- Sorgu yürütme istatistikleri bilgilerini kalıcı hale getiren çalışma zamanı istatistikleri deposu.
- 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 columnOne
abs(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_length kullanı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 , nothing undefined . delete insert update select unknown |
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), 3 2 (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), 3 2 (ekle), (sil), 4 (birleştirme), 5 (yardımcı program), 6 7 (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 on
veya depolama kapasitesine ulaşıldığında salt okunur mod otomatik olarak etkinleştirilirse Sorgu Deposu hiçbir veri yakalamaz.