All Products
Search
Document Center

AnalyticDB:Diagnostik kueri lambat

Last Updated:Mar 29, 2026

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:

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-bidangApa yang diukur
optimizer_duration_msWaktu untuk menghasilkan rencana eksekusi
lock_wait_time_msWaktu menunggu lock
queue_wait_time_msWaktu menunggu antrian sumber daya
executor_duration_msWaktu 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 -1 untuk 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 -1 untuk 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)

BidangTipeDeskripsi
query_idtextID unik kueri.
session_idintegerID sesi kueri.
db_namecharacter varying(128)Nama database yang dikueri.
user_namecharacter varying(128)Nama pengguna yang memulai kueri.
application_namecharacter varying(128)Aplikasi yang memulai kueri.
client_hostnamecharacter varying(128)Hostname klien.
client_addrcharacter varying(128)Alamat IP klien.
client_portcharacter varying(32)Port klien.
rsg_namecharacter varying(128)Kelompok resource yang terkait dengan tabel yang diakses oleh kueri.
query_starttimestamptzWaktu mulai kueri.
query_endtimestamptzWaktu selesai kueri.
query_duration_msbigintTotal waktu kueri dalam milidetik. Sama dengan optimizer_duration_ms + lock_wait_time_ms + queue_wait_time_ms + executor_duration_ms.
optimizer_duration_msbigintWaktu untuk menghasilkan rencana eksekusi, dalam milidetik. Pernyataan SQL kompleks memakan waktu lebih lama.
lock_wait_time_msbigintWaktu tunggu lock, dalam milidetik.
queue_wait_time_msbigintWaktu menunggu antrian sumber daya, dalam milidetik.
executor_duration_msbigintWaktu untuk menjalankan kueri pada mesin eksekusi, dalam milidetik.
querytextTeks pernyataan SQL.
is_plpgsqlbooleanApakah kueri merupakan prosedur tersimpan PL/pgSQL.
query_optimizercharacter varying(16)Pengoptimal yang digunakan. Nilai valid: ORCA, Planner.
access_tablestextNama tabel yang diakses oleh kueri.
result_rowsbigintJumlah baris yang dikembalikan. Untuk pernyataan INSERT, jumlah baris yang dimasukkan.
num_segmentsintegerJumlah node komputasi tempat kueri dijalankan.
num_slicesintegerJumlah slice dalam rencana eksekusi kueri.
cpu_time_msnumericTotal waktu CPU dalam milidetik, termasuk node koordinator dan semua node komputasi.
mem_bytesnumericPenggunaan memori puncak kumulatif per node. Merupakan perkiraan penggunaan memori aktual; bukan nilai eksak.
spill_bytesnumericNilai 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)

BidangTipeDeskripsi
hostnamecharacter varying(128)Hostname node.
hostroletextPeran node. Nilai valid: master (node koordinator), segment (node komputasi).
query_idtextID unik kueri.
db_namecharacter varying(128)Nama database yang dikueri.
user_namecharacter varying(128)Nama pengguna yang memulai kueri.
query_starttimestamptzWaktu mulai kueri.
query_endtimestamptzWaktu selesai kueri.
querytextTeks pernyataan SQL.
query_duration_msbigintWaktu eksekusi kueri, dalam milidetik.
optimizer_duration_msbigintWaktu untuk menghasilkan rencana eksekusi, dalam milidetik.
host_cpu_time_msnumericWaktu CPU kueri pada node ini, dalam milidetik.
host_mem_bytesnumericPenggunaan memori puncak kueri pada node ini.
host_spill_bytesnumericData maksimum kumulatif yang ditulis ke disk pada node ini.