Bagikan melalui


Memantau performa dengan Penyimpanan Kueri

BERLAKU UNTUK: Azure Database for PostgreSQL - Server Fleksibel

Fitur Penyimpanan Kueri di server fleksibel Azure Database for PostgreSQL menyediakan cara untuk melacak performa kueri dari waktu ke waktu. Penyimpanan Kueri menyederhanakan pemecahan masalah performa dengan membantu Anda menemukan kueri terlama dan paling intensif sumber daya dengan cepat. Penyimpanan Kueri secara otomatis menangkap riwayat kueri dan statistik waktu proses, dan menyimpannya untuk Anda tinjau. Ini mengiris data berdasarkan waktu sehingga Anda dapat melihat pola penggunaan temporal. Data untuk semua pengguna, database, dan kueri disimpan dalam database bernama azure_sys di instans server fleksibel Azure Database for PostgreSQL.

Penting

Jangan ubah basis data azure_sys atau skemanya. Melakukannya akan mencegah Penyimpanan Kueri dan fitur performa terkait berfungsi dengan benar.

Mengaktifkan Penyimpanan Kueri

Penyimpanan Kueri tersedia di semua wilayah tanpa biaya tambahan. Ini adalah fitur keikutsertaan, sehingga tidak diaktifkan secara default di server. Penyimpanan kueri dapat diaktifkan atau dinonaktifkan secara global untuk semua database di server tertentu dan tidak dapat diaktifkan atau dinonaktifkan per database.

Penting

Jangan aktifkan Penyimpanan Kueri pada tingkat harga burstable karena akan menyebabkan dampak performa.

Mengaktifkan Penyimpanan Kueri di portal Azure

  1. Masuk ke portal Azure dan pilih instans server fleksibel Azure Database for PostgreSQL Anda.
  2. Pilih Parameter server di bagian Pengaturan menu.
  3. Cari parameter pg_qs.query_capture_mode.
  4. Atur nilai ke TOP atau ALL, tergantung pada apakah Anda ingin melacak kueri tingkat atas atau juga kueri berlapis (yang dijalankan di dalam fungsi atau prosedur), dan klik Simpan. Izinkan hingga 20 menit agar batch data pertama bertahan di database azure_sys.

Mengaktifkan Pengambilan Sampel Tunggu Penyimpanan Kueri

  1. Cari parameter pgms_wait_sampling.query_capture_mode.
  2. Atur nilainya ke ALL dan Simpan.

Informasi di Penyimpanan Kueri

Penyimpanan Kueri terdiri dari dua penyimpanan:

  1. Penyimpanan statistik runtime untuk mempertahankan informasi statistik eksekusi kueri.
  2. Penyimpanan statistik tunggu untuk mempertahankan informasi statistik tunggu.

Skenario umum untuk menggunakan Penyimpanan Kueri meliputi:

  • Menentukan berapa kali kueri dijalankan dalam jendela waktu tertentu.
  • Membandingkan waktu eksekusi rata-rata kueri di seluruh jendela waktu untuk melihat delta besar.
  • Mengidentifikasi kueri terlama dalam beberapa jam terakhir.
  • Mengidentifikasi kueri N teratas yang menunggu sumber daya.
  • Memahami sifat tunggu untuk kueri tertentu.

Untuk meminimalkan penggunaan ruang, statistik eksekusi runtime di penyimpanan statistik runtime diagregat melalui jendela waktu yang tetap dan dapat dikonfigurasi. Informasi di penyimpanan ini dapat dikueri menggunakan tampilan.

Mengakses informasi Penyimpanan Kueri

Data Penyimpanan Kueri disimpan dalam database azure_sys di instans server fleksibel Azure Database for PostgreSQL Anda. Kueri berikut mengembalikan informasi tentang kueri di penyimpanan kueri:

SELECT * FROM  query_store.qs_view;

Atau kueri ini untuk statistik tunggu:

SELECT * FROM  query_store.pgms_wait_sampling_view;

Menemukan kueri tunggu

Jenis peristiwa tunggu menggabungkan berbagai peristiwa tunggu ke dalam wadah berdasarkan kesamaan. Microsoft Store Kueri menyediakan tipe peristiwa tunggu, nama peristiwa tunggu tertentu, dan kueri yang dimaksud. Mampu menghubungkan informasi tunggu ini dengan statistik runtime kueri yang berarti Anda bisa mendapatkan pemahaman yang mendalam tentang apa yang berkontribusi pada karakteristik performa kueri.

Berikut adalah beberapa contoh bagaimana Anda bisa mendapatkan lebih banyak insight tentang beban kerja Anda menggunakan statistik tunggu di Microsoft Store Kueri:

Pengamatan Perbuatan
Waktu Tunggu Kunci Tinggi Periksa teks kueri untuk kueri yang terpengaruh dan identifikasi entitas target. Lihat di Microsoft Store Kueri untuk kueri lain yang memodifikasi entitas yang sama, yang sering dieksekusi dan/atau memiliki durasi tinggi. Setelah mengidentifikasi kueri ini, pertimbangkan untuk mengubah logika aplikasi untuk meningkatkan konkurensi, atau menggunakan tingkat isolasi yang kurang ketat.
Waktu Tunggu IO Buffer Tinggi Temukan kueri dengan jumlah bacaan fisik yang tinggi di Microsoft Store Kueri. Jika mereka mencocokkan kueri dengan penantian IO tinggi, pertimbangkan untuk memperkenalkan indeks pada entitas yang mendasarinya, untuk melakukan pencarian alih-alih pemindaian. Ini akan meminimalkan overhead IO dari kueri. Periksa Rekomendasi Performa untuk server Anda di portal guna melihat apakah ada rekomendasi indeks untuk server ini yang akan mengoptimalkan kueri.
Waktu Tunggu Memori Tinggi Temukan kueri penggunaan memori teratas di Microsoft Store Kueri. Kueri ini mungkin menunda perkembangan lebih lanjut dari kueri yang terpengaruh. Periksa Rekomendasi Performa untuk server Anda di portal untuk melihat apakah ada rekomendasi indeks yang dapat mengoptimalkan kueri ini.

Opsi konfigurasi

Saat Penyimpanan Kueri diaktifkan, Penyimpanan Kueri menyimpan data dalam jendela agregasi panjang yang ditentukan oleh pg_qs.interval_length_minutes parameter server (default hingga 15 menit). Untuk setiap jendela, jendela menyimpan 500 kueri berbeda per jendela. Opsi berikut tersedia untuk mengonfigurasi parameter Penyimpanan Kueri:

Parameter Keterangan Default Rentang
pg_qs.query_capture_mode Mengatur pernyataan mana yang dilacak. tidak ada tidak ada, teratas, semua
pg_qs.interval_length_minutes (*) Mengatur interval pengambilan query_store dalam hitungan menit untuk pg_qs - ini adalah frekuensi persistensi data. 15 1 - 30
pg_qs.store_query_plans Mengaktifkan atau menonaktifkan paket kueri untuk pg_qs. off aktif, nonaktif
pg_qs.max_plan_size Mengatur jumlah byte maksimal yang akan disimpan untuk teks rencana kueri untuk pg_qs; rencana yang lebih panjang akan dipotong. 7.500 100 - 10k
pg_qs.max_query_text_length Mengatur panjang kueri maksimum yang dapat disimpan; kueri yang lebih panjang akan dipotong. 6000 100 - 10K
pg_qs.retention_period_in_days Mengatur jendela periode retensi dalam hari untuk pg_qs - setelah waktu ini data akan dihapus. 7 1 - 30
pg_qs.track_utility Mengatur apakah perintah utilitas dilacak oleh pg_qs. aktif aktif, nonaktif

(*) Parameter server statis yang memerlukan hidupkan ulang server agar perubahan nilainya diterapkan.

Opsi berikut berlaku khusus untuk statistik tunggu:

Parameter Keterangan Default Rentang
pgms_wait_sampling.query_capture_mode Memilih pernyataan mana yang dilacak oleh ekstensi pgms_wait_sampling. tidak ada tidak ada, semua
Pgms_wait_sampling.history_period Mengatur frekuensi, dalam milidetik, di mana peristiwa tunggu diambil sampelnya. 100 1-600000

Catatan

pg_qs.query_capture_mode menggantikan pgms_wait_sampling.query_capture_mode. Jika pg_qs.query_capture_mode TIDAK ADA, pengaturan pgms_wait_sampling.query_capture_mode tidak berpengaruh.

Gunakan portal Microsoft Azure untuk mendapatkan atau mengatur nilai yang berbeda untuk suatu parameter.

Tampilan dan fungsi

Menampilkan dan mengelola Penyimpanan Kueri menggunakan tampilan dan fungsi berikut. Siapa pun dalam peran publik PostgreSQL dapat menggunakan tampilan ini untuk melihat data di Query Store. Tampilan ini hanya tersedia di database azure_sys.

Kueri dinormalisasi dengan melihat strukturnya dan mengabaikan apa pun yang tidak signifikan secara semantik, seperti literal, konstanta, alias, atau perbedaan dalam casing.

Jika dua kueri identik secara semantik, bahkan jika menggunakan alias yang berbeda untuk kolom dan tabel yang direferensikan yang sama, kueri tersebut diidentifikasi dengan query_id yang sama. Jika dua kueri hanya berbeda dalam nilai harfiah yang digunakan di dalamnya, kueri juga diidentifikasi dengan query_id yang sama. Untuk semua kueri yang diidentifikasi dengan query_id yang sama, sql_query_text kuerinya akan menjadi kueri yang dijalankan terlebih dahulu sejak Penyimpanan Kueri mulai merekam aktivitas, atau sejak terakhir kali data yang bertahan dibuang karena fungsi query_store.qs_reset dijalankan.

Cara kerja normalisasi kueri

Berikut adalah beberapa contoh untuk mencoba menggambarkan cara kerja normalisasi ini:

Katakanlah Anda membuat tabel dengan pernyataan berikut:

create table tableOne (columnOne int, columnTwo int);

Anda mengaktifkan pengumpulan data Penyimpanan Kueri, dan satu atau beberapa pengguna menjalankan kueri berikut, dalam urutan yang tepat ini:

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";

Semua kueri sebelumnya berbagi query_id yang sama. Dan teks yang disimpan Penyimpanan Kueri adalah kueri pertama yang dijalankan setelah mengaktifkan pengumpulan data. Oleh karena itu, itu akan menjadi select * from tableOne;.

Kumpulan kueri berikut, setelah dinormalisasi, tidak cocok dengan kumpulan kueri sebelumnya karena klausa WHERE membuatnya berbeda secara semantik:

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;

Namun, semua kueri dalam set terakhir ini berbagi query_id yang sama dan teks yang digunakan untuk mengidentifikasi semuanya adalah kueri pertama dalam batch select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;.

Terakhir, temukan beberapa kueri di bawah ini yang tidak cocok dengan query_id yang ada di batch sebelumnya, dan alasan mengapa mereka tidak:

Kueri:

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

Alasan untuk tidak cocok: Daftar kolom mengacu pada dua kolom yang sama (columnOne dan ColumnTwo), tetapi urutan di mana kolom yang dirujuk dibalik, dari columnOne, ColumnTwo dalam batch sebelumnya ke ColumnTwo, columnOne dalam kueri ini.

Kueri:

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

Alasan untuk tidak cocok: Urutan di mana ekspresi yang dievaluasi dalam klausa WHERE dirujuk dibalik dari columnOne = ? and ColumnTwo = ? dalam batch sebelumnya ke ColumnTwo = ? and columnOne = ? dalam kueri ini.

Kueri:

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

Alasan untuk tidak cocok: Ekspresi pertama dalam daftar kolom tidak columnOne lagi, tetapi fungsi abs dievaluasi melalui columnOne (abs(columnOne)), yang tidak setara secara semantik.

Kueri:

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

Alasan untuk tidak cocok: Ekspresi pertama dalam klausul WHERE tidak mengevaluasi kesetaraan columnOne dengan literal lagi, tetapi dengan hasil fungsi ceiling yang dievaluasi melalui literal, yang tidak setara secara semantik.

Tampilan

query_store.qs_view

Tampilan ini mengembalikan semua data yang telah dipertahankan dalam tabel pendukung Penyimpanan Kueri. Data yang sedang direkam dalam memori untuk jendela waktu aktif saat ini, tidak terlihat sampai jendela waktu berakhir, dan data volatil dalam memori dikumpulkan dan disimpan ke tabel yang disimpan di disk. Tampilan ini mengembalikan baris yang berbeda untuk setiap database berbeda (db_id), pengguna (user_id), dan kueri (query_id).

Nama Jenis Referensi Keterangan
runtime_stats_entry_id bigint ID dari tabel runtime_stats_entries.
user_id oid pg_authid.oid OID pengguna yang menjalankan pernyataan.
db_id oid pg_database.oid OID database tempat pernyataan dijalankan.
query_id bigint Kode hash internal, dihitung dari pohon penguraian pernyataan.
query_sql_text varchar(10000) Teks pernyataan perwakilan. Kueri yang berbeda dengan struktur yang sama dikelompokkan bersama; teks ini adalah teks untuk kueri pertama dalam kluster. Nilai default untuk panjang teks kueri maksimum adalah 6000, dan dapat dimodifikasi menggunakan parameter pg_qs.max_query_text_lengthpenyimpanan kueri . Jika teks kueri melebihi nilai maksimum ini, teks akan dipotong ke karakter pertama pg_qs.max_query_text_length .
plan_id bigint ID paket yang sesuai dengan kueri ini.
waktu_mulai rentang waktu Kueri diagregasi oleh jendela waktu, yang rentang waktunya ditentukan oleh parameter pg_qs.interval_length_minutes server (defaultnya adalah 15 menit). Ini adalah waktu mulai yang sesuai dengan jendela waktu untuk entri ini.
end_time rentang waktu Waktu akhir yang sesuai dengan jendela waktu untuk entri ini.
panggilan bigint Berapa kali kueri dijalankan di jendela waktu ini. Perhatikan bahwa untuk kueri paralel, jumlah panggilan untuk setiap eksekusi sesuai dengan 1 untuk proses backend yang mendorong eksekusi kueri, ditambah sebanyak mungkin unit lain untuk setiap proses pekerja backend, diluncurkan untuk berkolaborasi mengeksekusi cabang paralel dari pohon eksekusi.
total_time presisi ganda Total waktu eksekusi kueri, dalam milidetik.
min_time presisi ganda Waktu eksekusi kueri minimum, dalam milidetik.
max_time presisi ganda Waktu eksekusi kueri maksimum, dalam milidetik.
mean_time presisi ganda Rata-rata waktu eksekusi kueri, dalam milidetik.
stddev_time presisi ganda Simpangan baku waktu eksekusi kueri, dalam milidetik.
baris bigint Jumlah total baris yang diambil atau dipengaruhi oleh pernyataan. Perhatikan bahwa untuk kueri paralel, jumlah baris untuk setiap eksekusi sesuai dengan jumlah baris yang dikembalikan ke klien oleh proses backend yang mendorong eksekusi kueri, ditambah jumlah semua baris yang setiap proses pekerja backend, diluncurkan untuk berkolaborasi mengeksekusi cabang paralel dari pohon eksekusi, kembali ke proses backend mengemudi.
shared_blks_hit bigint Jumlah total hit cache blok bersama oleh pernyataan.
shared_blks_read bigint Jumlah total blok bersama yang dibaca oleh pernyataan.
shared_blks_dirtied bigint Jumlah total blok bersama yang dikorsi oleh pernyataan.
shared_blks_written bigint Jumlah total blok bersama yang ditulis oleh pernyataan.
local_blks_hit bigint Jumlah total hit cache blok lokal oleh pernyataan .
local_blks_read bigint Jumlah total blok lokal yang dibaca oleh pernyataan.
local_blks_dirtied bigint Jumlah total blok lokal yang dikorsi oleh pernyataan.
local_blks_written bigint Jumlah total blok lokal yang ditulis oleh pernyataan.
temp_blks_read bigint Jumlah total blok sementara yang dibaca oleh pernyataan.
temp_blks_written bigint Jumlah total blok sementara yang ditulis oleh pernyataan.
blk_read_time presisi ganda Total waktu yang dihabiskan pernyataan untuk membaca blok, dalam milidetik (jika track_io_timing diaktifkan, jika tidak nol).
blk_write_time presisi ganda Total waktu yang dihabiskan pernyataan untuk menulis blok, dalam milidetik (jika track_io_timing diaktifkan, jika tidak nol).
is_system_query Boolean Menentukan apakah kueri dijalankan oleh peran dengan user_id = 10 (azuresu), yang memiliki hak istimewa superuser dan digunakan untuk melakukan operasi panel kontrol. Karena layanan ini adalah layanan PaaS terkelola, hanya Microsoft yang merupakan bagian dari peran superuser tersebut.
query_type text Jenis operasi yang diwakili oleh kueri. Nilai yang mungkin adalah unknown, , updateselect, insert, delete, merge, utility, nothing, undefined.

query_store.query_texts_view

Tampilan ini mengembalikan data teks kueri di Penyimpanan Kueri. Ada satu baris untuk setiap query_sql_text yang berbeda.

Nama Jenis Keterangan
query_text_id bigint ID untuk tabel query_texts
query_sql_text varchar(10000) Teks pernyataan perwakilan. Kueri yang berbeda dengan struktur yang sama dikelompokkan bersama; teks ini adalah teks untuk kueri pertama dalam kluster.
query_type smallint Jenis operasi yang diwakili oleh kueri. Dalam versi PostgreSQL <= 14, nilai yang mungkin adalah 0 (tidak diketahui), 1 (pilih), 2 (perbarui), 3 (sisipkan), 4 (hapus), 5 (utilitas), 6 (tidak ada). Dalam versi PostgreSQL >= 15, nilai yang mungkin adalah 0 (tidak diketahui), 1 (pilih), 2 (perbarui), 3 (sisipkan), 4 (hapus), 5 (gabungkan), 6 (utilitas), 7 (tidak ada).

query_store.pgms_wait_sampling_view

Tampilan ini mengembalikan data tunggu peristiwa di Penyimpanan Kueri. Tampilan ini mengembalikan baris yang berbeda untuk setiap database berbeda (db_id), pengguna (user_id), kueri (query_id), dan peristiwa (peristiwa).

Nama Jenis Referensi Keterangan
waktu_mulai rentang waktu Kueri diagregasi oleh jendela waktu, yang rentang waktunya ditentukan oleh parameter pg_qs.interval_length_minutes server (defaultnya adalah 15 menit). Ini adalah waktu mulai yang sesuai dengan jendela waktu untuk entri ini.
end_time rentang waktu Waktu akhir yang sesuai dengan jendela waktu untuk entri ini.
user_id oid pg_authid.oid OID pengguna yang menjalankan pernyataan.
db_id oid pg_database.oid OID database tempat pernyataan dijalankan.
query_id bigint Kode hash internal, dihitung dari pohon penguraian pernyataan.
event_type text Jenis peristiwa yang dinanti backend.
event text Nama peristiwa tunggu jika backend saat ini menunggu.
panggilan Integer Berapa kali peristiwa yang sama telah diambil.

Catatan

Untuk daftar nilai yang mungkin dalam kolom event_type dan peristiwa tampilan query_store.pgms_wait_sampling_view, lihat dokumentasi resmi pg_stat_activity dan cari informasi yang mengacu pada kolom dengan nama yang sama.

query_store.query_plans_view

Tampilan ini mengembalikan rencana kueri yang digunakan untuk menjalankan kueri. Ada satu baris per setiap ID database yang berbeda, dan ID kueri. Ini hanya akan menyimpan rencana kueri untuk kueri non-penggunaan.

plan_id db_id query_id plan_text
plan_id bigint Nilai hash dari rencana kueri yang dinormalisasi yang dihasilkan oleh EXPLAIN. Ini dianggap dinormalisasi karena mengecualikan perkiraan biaya simpul rencana dan penggunaan buffer.
db_id oid pg_database.oid OID database tempat pernyataan dijalankan.
query_id bigint Kode hash internal, dihitung dari pohon penguraian pernyataan.
plan_text varchar(10000) Rencana eksekusi pernyataan yang diberikan costs=false, buffers=false, dan format=text. Ini adalah output yang sama yang diberikan oleh EXPLAIN.

Fungsi

query_store.qs_reset

Fungsi ini membuang semua statistik yang dikumpulkan sejauh ini oleh Penyimpanan Kueri. Ini membuang statistik untuk jendela waktu yang sudah ditutup, yang telah dipertahankan pada tabel disk, dan yang untuk jendela waktu saat ini, yang masih disimpan dalam memori. Fungsi ini hanya dapat dijalankan oleh peran admin server (azure_pg_admin).

query_store.staging_data_reset

Fungsi ini membuang semua statistik yang dikumpulkan dalam memori oleh Penyimpanan Kueri (yaitu, data dalam memori yang belum dihapus ke tabel disk yang mendukung persistensi data yang dikumpulkan untuk Penyimpanan Kueri). Fungsi ini hanya dapat dijalankan oleh peran admin server (azure_pg_admin).

Batasan dan masalah yang diketahui

Kompatibilitas Azure Storage dan Query Store

Karena masalah kompatibilitas, Anda tidak dapat mengaktifkan ekstensi Azure Storage dan Query Store secara bersamaan. Untuk memastikan fungsi yang tepat dan menghindari potensi konflik, aktifkan hanya salah satu ekstensi ini pada satu waktu.

Untuk menggunakan Azure Storage:

  • Nonaktifkan Penyimpanan Kueri dengan mengatur parameter pg_qs.query_capture_mode ke NONE. Parameter ini dinamis, jadi Anda tidak perlu menghidupkan ulang.

Untuk menggunakan Penyimpanan Kueri:

  1. Nonaktifkan ekstensi Azure Storage dengan mengeluarkan DROP EXTENSION azure_storage;.
  2. Hapus Azure Storage dari shared_preload_libraries.
  3. Mulai ulang server database Anda.

Langkah-langkah ini diperlukan untuk mencegah konflik dan untuk memastikan bahwa sistem Anda beroperasi dengan benar. Kami berupaya mengatasi masalah kompatibilitas ini dan akan memberi Anda informasi tentang pembaruan apa pun.

Mode baca-saja

Saat instans Azure Database for PostgreSQL - Server Fleksibel berada dalam mode baca-saja, seperti ketika default_transaction_read_only parameter diatur ke on, atau jika mode baca-saja diaktifkan secara otomatis karena mencapai kapasitas penyimpanan, Penyimpanan Kueri tidak menangkap data apa pun.