AnalyticDB for PostgreSQL mencatat kueri lambat secara otomatis. Untuk mendiagnosis masalah performa, kueri dua tampilan bawaan di database postgres: qmonitor.instance_slow_queries untuk analisis tingkat instans, dan qmonitor.host_slow_queries untuk analisis per-node.
Prasyarat
Sebelum memulai, pastikan bahwa:
Instans Anda menjalankan AnalyticDB for PostgreSQL V7.0 dalam mode elastic storage dengan versi mesin minor V7.0.5.0 atau yang lebih baru. Untuk memeriksa atau memperbarui versi mesin minor, lihat Lihat versi mesin minor dan Perbarui versi mesin minor.
Fitur diagnostik kueri lambat telah diaktifkan. Lihat Aktifkan atau nonaktifkan diagnostik kueri lambat.
Catatan penggunaan
Log kueri lambat menyimpan data selama 7 hari terakhir dan tidak mencatat kueri yang gagal.
Pernyataan SQL yang lebih panjang dari 1.024 byte akan dipotong dalam log.
Semua pernyataan SQL yang memakan waktu 1 detik atau lebih lama, serta semua pernyataan DDL, dicatat secara default. Ambang batas ini dikendalikan oleh parameter konfigurasi Grand Unified Configuration (GUC)
slow_query_min_duration. Untuk memastikan stabilitas sistem, kami menyarankan agar Anda tidak mengubah pengaturan default parameter ini.
Aktifkan atau nonaktifkan diagnostik kueri lambat
Sambungkan ke database postgres dan jalankan perintah berikut.
Untuk memeriksa status saat ini:
SHOW adbpg_feature_enable_query_monitor;Untuk mengaktifkan fitur pada database tertentu:
-- Ganti <database_name> dengan nama database bisnis Anda.
ALTER DATABASE <database_name> SET adbpg_feature_enable_query_monitor TO ON;Untuk menonaktifkan fitur tersebut, atur nilainya menjadi OFF.
Kueri log kueri lambat
Semua contoh di bawah ini dijalankan terhadap qmonitor.instance_slow_queries (tingkat instans) atau qmonitor.host_slow_queries (tingkat node). Sambungkan ke database postgres sebelum menjalankannya.
Untuk deskripsi lengkap semua bidang di kedua tampilan tersebut, lihat Bidang tampilan.
Berdasarkan rentang waktu
Kueri semua pernyataan lambat yang dieksekusi dalam 30 menit terakhir:
SELECT
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.instance_slow_queries
WHERE query_start >= now() - interval '30 min';Kueri semua pernyataan lambat yang dieksekusi pada tanggal tertentu (misalnya, 26 Februari 2024):
SELECT
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.instance_slow_queries
WHERE query_start >= '2024-02-26 00:00:00'
AND query_end <= '2024-02-27 00:00:00';Berdasarkan konsumsi resource (tingkat instans)
query_duration_ms merupakan jumlah dari empat sub-bidang:
| Sub-bidang | Apa yang diukur |
|---|---|
optimizer_duration_ms | Waktu untuk menghasilkan rencana eksekusi |
lock_wait_time_ms | Waktu menunggu lock |
queue_wait_time_ms | Waktu menunggu antrian sumber daya |
executor_duration_ms | Waktu untuk menjalankan kueri pada mesin eksekusi |
Ketika suatu kueri lambat, periksa sub-bidang mana yang mendominasi untuk mengidentifikasi bottleneck. Sebagai contoh, nilai queue_wait_time_ms yang tinggi menunjukkan adanya kontensi antrian sumber daya, bukan masalah eksekusi.
20 teratas berdasarkan waktu CPU dalam 30 menit terakhir:
SELECT
(cpu_time_ms / 1000)::text || ' s' AS "CPU time",
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.instance_slow_queries
WHERE query_start >= now() - interval '30 min'
ORDER BY cpu_time_ms DESC
LIMIT 20;20 teratas berdasarkan penggunaan memori dalam 30 menit terakhir:
SELECT
pg_size_pretty(mem_bytes) AS "Memory consumed",
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.instance_slow_queries
WHERE query_start >= now() - interval '30 min'
ORDER BY mem_bytes DESC
LIMIT 20;mem_bytes mencatat penggunaan memori puncak kumulatif di seluruh node. Nilai ini merupakan perkiraan penggunaan memori aktual dan tidak eksak karena memori berfluktuasi selama eksekusi kueri.10 teratas berdasarkan waktu CPU dalam jendela waktu tertentu (misalnya, pukul 00:00–12:00 pada 26 Februari 2024):
SELECT
(cpu_time_ms / 1000)::text || ' s' AS "CPU time",
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.instance_slow_queries
WHERE query_start >= '2024-02-26 00:00:00'
AND query_end <= '2024-02-26 12:00:00'
ORDER BY cpu_time_ms DESC
LIMIT 10;Berdasarkan konsumsi resource (tingkat node)
Gunakan qmonitor.host_slow_queries untuk mendiagnosis kueri lambat pada node tertentu.
20 teratas berdasarkan waktu CPU pada suatu node dalam 30 menit terakhir:
SELECT
(host_cpu_time_ms / 1000)::text || ' s' AS "CPU time",
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.host_slow_queries
WHERE hostname = '<node_hostname>'
AND query_start >= now() - interval '30 min'
ORDER BY host_cpu_time_ms DESC
LIMIT 20;20 teratas berdasarkan penggunaan memori pada suatu node dalam 30 menit terakhir:
SELECT
pg_size_pretty(host_mem_bytes) AS "Memory consumed",
query_start AS "Start time",
query_end AS "End time",
query_duration_ms AS "Duration (ms)",
query_id AS "Query ID",
query AS "SQL statement"
FROM qmonitor.host_slow_queries
WHERE hostname = '<node_hostname>'
AND query_start >= now() - interval '30 min'
ORDER BY host_mem_bytes DESC
LIMIT 20;Ganti <node_hostname> dengan hostname aktual node yang akan didiagnosis.
Berdasarkan pengguna
Hitung jumlah kueri lambat per pengguna dalam 10 menit terakhir untuk mengidentifikasi akun mana yang menghasilkan kueri lambat terbanyak:
SELECT
user_name AS "User",
COUNT(1) AS "Slow query count"
FROM qmonitor.instance_slow_queries
WHERE query_start >= now() - interval '10 min'
GROUP BY user_name
ORDER BY COUNT(1) DESC;Berdasarkan ID kueri
Ambil detail lengkap kueri lambat tertentu berdasarkan ID-nya:
SELECT * FROM qmonitor.instance_slow_queries
WHERE query_id = '<query_id>';Ekspor log kueri lambat
Gunakan pernyataan SELECT untuk mengekspor data dari qmonitor.instance_slow_queries atau qmonitor.host_slow_queries ke tabel internal, bucket Object Storage Service (OSS), atau tabel MaxCompute. Untuk metode ekspor, lihat Data Lake Analysis.
Di AnalyticDB for PostgreSQL, indeks dibuat untuk log kueri lambat dan log kueri lambat dipartisi berdasarkan query_start. Untuk performa yang lebih baik, selalu sertakan query_start dalam klausa WHERE guna menghindari pemindaian tabel penuh.
Sebagai contoh, untuk mengekspor log dari pukul 13:00 hingga 16:00 pada 26 Februari 2024:
-- Tambahkan kondisi ini ke pernyataan SELECT Anda.
WHERE query_start >= '2024-02-26 13:00:00'
AND query_start <= '2024-02-26 16:00:00'Konfigurasikan ambang batas
Hanya superuser yang dapat memodifikasi item konfigurasi ini.
slow_query_min_duration
Mengontrol waktu eksekusi minimum agar suatu kueri dicatat sebagai kueri lambat. Nilai default adalah 1s. Anda juga dapat memodifikasi item konfigurasi ini untuk mengumpulkan kueri lambat yang memakan waktu kurang dari 1 detik.
Jika waktu eksekusi lebih besar dari atau sama dengan nilai ini, pernyataan SQL, waktu eksekusi, dan metrik terkait akan dicatat.
Atur ke
-1untuk menonaktifkan pengumpulan kueri lambat sepenuhnya.
Untuk mengubah ambang batas pada database tertentu (memerlukan superuser):
-- Kumpulkan kueri lambat yang memakan waktu 5 detik atau lebih lama.
ALTER DATABASE '<database_name>' SET slow_query_min_duration = '5s';Untuk mengubah ambang batas hanya untuk sesi saat ini (dapat dijalankan oleh pengguna apa pun):
SET slow_query_min_duration = '5s';slow_query_plan_min_duration
Mengontrol waktu eksekusi minimum agar rencana eksekusi kueri lambat dikumpulkan. Nilai default adalah 10s.
Jika waktu eksekusi lebih besar dari atau sama dengan nilai ini, rencana eksekusi akan dikumpulkan bersama metrik kueri.
Untuk inspeksi rencana ad-hoc, gunakan
EXPLAIN—Anda tidak perlu mengumpulkan rencana secara otomatis.Atur ke
-1untuk menonaktifkan pengumpulan rencana eksekusi sepenuhnya.
Untuk mengubah ambang batas pada database tertentu (memerlukan superuser):
ALTER DATABASE '<database_name>' SET slow_query_plan_min_duration = '10s';Untuk mengubah ambang batas hanya untuk sesi saat ini:
SET slow_query_plan_min_duration = '10s';Bidang tampilan
qmonitor.instance_slow_queries (tingkat instans)
| Bidang | Tipe | Deskripsi |
|---|---|---|
query_id | text | ID unik kueri. |
session_id | integer | ID sesi kueri. |
db_name | character varying(128) | Nama database yang dikueri. |
user_name | character varying(128) | Nama pengguna yang memulai kueri. |
application_name | character varying(128) | Aplikasi yang memulai kueri. |
client_hostname | character varying(128) | Hostname klien. |
client_addr | character varying(128) | Alamat IP klien. |
client_port | character varying(32) | Port klien. |
rsg_name | character varying(128) | Kelompok resource yang terkait dengan tabel yang diakses oleh kueri. |
query_start | timestamptz | Waktu mulai kueri. |
query_end | timestamptz | Waktu selesai kueri. |
query_duration_ms | bigint | Total waktu kueri dalam milidetik. Sama dengan optimizer_duration_ms + lock_wait_time_ms + queue_wait_time_ms + executor_duration_ms. |
optimizer_duration_ms | bigint | Waktu untuk menghasilkan rencana eksekusi, dalam milidetik. Pernyataan SQL kompleks memakan waktu lebih lama. |
lock_wait_time_ms | bigint | Waktu tunggu lock, dalam milidetik. |
queue_wait_time_ms | bigint | Waktu menunggu antrian sumber daya, dalam milidetik. |
executor_duration_ms | bigint | Waktu untuk menjalankan kueri pada mesin eksekusi, dalam milidetik. |
query | text | Teks pernyataan SQL. |
is_plpgsql | boolean | Apakah kueri merupakan prosedur tersimpan PL/pgSQL. |
query_optimizer | character varying(16) | Pengoptimal yang digunakan. Nilai valid: ORCA, Planner. |
access_tables | text | Nama tabel yang diakses oleh kueri. |
result_rows | bigint | Jumlah baris yang dikembalikan. Untuk pernyataan INSERT, jumlah baris yang dimasukkan. |
num_segments | integer | Jumlah node komputasi tempat kueri dijalankan. |
num_slices | integer | Jumlah slice dalam rencana eksekusi kueri. |
cpu_time_ms | numeric | Total waktu CPU dalam milidetik, termasuk node koordinator dan semua node komputasi. |
mem_bytes | numeric | Penggunaan memori puncak kumulatif per node. Merupakan perkiraan penggunaan memori aktual; bukan nilai eksak. |
spill_bytes | numeric | Nilai kumulatif dari jumlah maksimum file yang disimpan ke disk pada node komputasi tempat kueri dijalankan. Nilai ini secara kasar mencerminkan ruang disk yang dikonsumsi oleh kueri tetapi bukan nilai eksak. |
qmonitor.host_slow_queries (tingkat node)
| Bidang | Tipe | Deskripsi |
|---|---|---|
hostname | character varying(128) | Hostname node. |
hostrole | text | Peran node. Nilai valid: master (node koordinator), segment (node komputasi). |
query_id | text | ID unik kueri. |
db_name | character varying(128) | Nama database yang dikueri. |
user_name | character varying(128) | Nama pengguna yang memulai kueri. |
query_start | timestamptz | Waktu mulai kueri. |
query_end | timestamptz | Waktu selesai kueri. |
query | text | Teks pernyataan SQL. |
query_duration_ms | bigint | Waktu eksekusi kueri, dalam milidetik. |
optimizer_duration_ms | bigint | Waktu untuk menghasilkan rencana eksekusi, dalam milidetik. |
host_cpu_time_ms | numeric | Waktu CPU kueri pada node ini, dalam milidetik. |
host_mem_bytes | numeric | Penggunaan memori puncak kueri pada node ini. |
host_spill_bytes | numeric | Data maksimum kumulatif yang ditulis ke disk pada node ini. |