全部产品
Search
文档中心

Hologres:Lihat dan analisis log kueri lambat

更新时间:Feb 05, 2026

Jika instans Hologres Anda merespons secara lambat atau kueri memerlukan waktu lebih lama dari yang diharapkan, Anda dapat melihat dan menganalisis log kueri lambat untuk mengidentifikasi akar permasalahan dengan cepat. Menganalisis kueri yang lambat atau gagal membantu Anda mendeteksi, mendiagnosis, dan menyelesaikan masalah performa guna mengoptimalkan kinerja sistem. Topik ini menjelaskan cara melihat dan menganalisis log kueri lambat di Hologres.

Panduan versi

Versi Hologres

Fitur

Deskripsi

V0.10

Menambahkan dukungan untuk melihat dan menganalisis log kueri lambat.

  • Fitur ini hanya tersedia di Hologres V0.10 atau versi yang lebih baru. Periksa versi instans Anda di halaman detail instans di Konsol Hologres. Jika instans Anda menjalankan versi sebelum V0.10, ikuti petunjuk dalam Common upgrade preparation errors atau hubungi tim Hologres melalui DingTalk untuk bantuan. Untuk informasi selengkapnya, lihat How do I get more online support?.

  • Di Hologres V0.10, log kueri FAILED tidak mencakup statistik waktu proses seperti penggunaan memori, pembacaan disk, volume data yang dibaca, waktu CPU, atau query_stats.

V2.2.7

Mengoptimalkan nilai default parameter log_min_duration_statement

Log kueri lambat mencatat semua pernyataan DDL, semua pernyataan SQL yang gagal, serta pernyataan SQL (seperti INSERT, SELECT, UPDATE, dan DELETE) yang waktu eksekusinya melebihi ambang batas log_min_duration_statement.

Mulai dari Hologres V2.2.7, nilai default log_min_duration_statement telah dioptimalkan dari 1 detik menjadi 100 ms. Tidak diperlukan penyesuaian manual. Jika instans Anda menjalankan versi sebelum V2.2.7, sesuaikan parameter ini secara manual seperti yang dijelaskan dalam log_min_duration_statement. Nilai minimum yang diizinkan adalah 100 ms.

Batasan

Kueri terhadap log kueri lambat di Hologres tunduk pada batasan berikut:

  • Secara default, log kueri lambat menyimpan data selama satu bulan. Anda dapat mengkueri data dari periode apa pun dalam satu bulan terakhir.

  • Untuk memastikan stabilitas sistem dan mencegah kelebihan trafik, satu kueri mengembalikan maksimal 10.000 entri log kueri lambat. Beberapa bidang dalam log kueri lambat memiliki batas panjang. Untuk informasi selengkapnya, lihat deskripsi bidang untuk tabel query_log.

  • Log kueri lambat merupakan bagian dari sistem gudang metadata Hologres. Kegagalan dalam mengkueri log kueri lambat tidak memengaruhi kueri bisnis yang sedang berjalan di instans Anda. Oleh karena itu, stabilitas log kueri lambat tidak dicakup oleh Service-Level Agreement (SLA) produk.

Lihat tabel query_log

Hologres menyimpan log kueri lambat di tabel sistem hologres.hg_query_log. Secara spesifik:

  • Setelah Anda meningkatkan instans ke V0.10 atau versi yang lebih baru, Hologres secara otomatis mengumpulkan kueri DML lambat yang memerlukan waktu lebih dari 100 ms dan semua operasi DDL.

  • Mulai dari V3.0.2, Hologres mengagregasi catatan operasi DML dan kueri yang selesai dalam waktu kurang dari 100 ms dan menyimpannya di tabel hologres.hg_query_log yang sama.

    • Sistem mengagregasi kueri DQL dan DML yang berhasil dengan sidik jari yang sama dan selesai dalam waktu kurang dari 100 ms.

    • Kunci agregasi mencakup: server_addr, usename, datname, warehouse_id, application_name, dan digest.

    • Setiap koneksi melaporkan data agregasi sekali per menit.

Tabel berikut menjelaskan bidang-bidang dalam tabel sistem hologres.hg_query_log.

Bidang

Tipe data

Deskripsi untuk kueri DML/DQL di atas 100 ms (catatan detail)

Deskripsi untuk kueri DML/DQL di bawah 100 ms (catatan agregasi)

usename

text

Username dari inisiator kueri.

Username dari inisiator kueri.

status

text

Status akhir kueri: sukses atau gagal.

  • Sukses: SUCCESS.

  • Gagal: FAILED.

Status akhir kueri: sukses (SUCCESS). Catatan agregasi hanya mencakup kueri yang berhasil.

query_id

text

Pengidentifikasi unik untuk kueri.

Semua kueri yang gagal memiliki query_id. Kueri yang berhasil mungkin tidak memiliki query_id.

ID kueri dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

digest

text

Enkoding sidik jari SQL.

Untuk kueri SELECT, INSERT, DELETE, dan UPDATE, sistem menghitung hash MD5 sebagai sidik jari SQL. Untuk detail tentang aturan pengumpulan dan perhitungan sidik jari SQL, lihat SQL fingerprint.

Catatan

Mulai dari Hologres V2.2, kolom digest menampilkan hash sidik jari SQL. Jika instans Anda menjalankan V2.1 atau versi sebelumnya, hubungi dukungan teknis Hologres untuk melakukan peningkatan.

Enkoding sidik jari SQL.

datname

text

Nama database yang dikueri.

Nama database yang dikueri.

command_tag

text

Jenis kueri.

Mencakup:

  • DML: COPY, DELETE, INSERT, SELECT, UPDATE, dll.

  • DDL: ALTER TABLE, BEGIN, COMMENT, COMMIT, CREATE FOREIGN TABLE, CREATE TABLE, DROP FOREIGN TABLE, DROP TABLE, IMPORT FOREIGN SCHEMA, ROLLBACK, TRUNCATE TABLE

  • Lainnya: CALL, CREATE EXTENSION, EXPLAIN, GRANT, SECURITY LABEL, dll.

Jenis kueri dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

warehouse_id

integer

ID kelompok komputasi yang digunakan untuk kueri.

ID kelompok komputasi dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

warehouse_name

integer

Nama kelompok komputasi yang digunakan untuk kueri.

Nama kelompok komputasi dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

warehouse_cluster_id

integer

Baru di Hologres V3.0.2. ID kluster dalam kelompok komputasi yang digunakan untuk kueri. ID kluster dimulai dari 1 di setiap kelompok komputasi.

ID kluster dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

duration

integer

Durasi kueri dalam milidetik (ms).

Bidang duration merepresentasikan total waktu eksekusi SQL, termasuk hal-hal berikut:

  • Optimization Cost: Waktu untuk menghasilkan rencana eksekusi. Nilai tinggi biasanya mengindikasikan SQL yang kompleks.

  • Start Query Cost: Waktu startup kueri. Nilai tinggi biasanya mengindikasikan kontensi lock atau menunggu sumber daya.

  • Get Result Cost: Waktu eksekusi kueri. Nilai tinggi biasanya mengindikasikan komputasi berat atau eksekusi lama. Optimalkan SQL berdasarkan kebutuhan bisnis Anda.

  • Biaya waktu lainnya dijelaskan secara rinci dalam bidang extend_cost dan biasanya mencakup hal-hal berikut:

    • build_dag: Waktu untuk membangun DAG komputasi untuk mesin eksekusi. Saat mengakses tabel eksternal, langkah ini mengambil metadata tabel eksternal. Nilai tinggi biasanya mengindikasikan akses metadata yang lambat.

    • prepare_reqs: Waktu untuk menyiapkan permintaan bagi mesin eksekusi, termasuk menyiapkan komponen dan mengambil alamat shard. Nilai tinggi biasanya mengindikasikan respons layanan internal yang lambat untuk pencarian alamat shard.

Secara default, sistem menampilkan kueri DML yang lebih lama dari 1 detik dan semua kueri DDL. Gunakan parameter GUC log_min_duration_statement untuk menyesuaikan ambang batas pengumpulan. Untuk detailnya, lihat Configuration items.

Rata-rata durasi kueri dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

message

text

Pesan error.

Kosong.

query_start

timestamptz

Waktu mulai kueri.

Waktu mulai kueri dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

query_date

text

Tanggal mulai kueri.

Tanggal mulai kueri dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

query

text

Teks kueri.

Panjang kueri dibatasi hingga 51.200 karakter. Kueri yang lebih panjang mungkin dipotong.

Teks kueri dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

result_rows

bigint

Jumlah baris yang dikembalikan.

Untuk perintah INSERT, ini menunjukkan jumlah baris yang dimasukkan.

Rata-rata result_rows dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

result_bytes

bigint

Jumlah byte yang dikembalikan.

Rata-rata result_bytes dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

read_rows

bigint

Jumlah baris data yang dibaca.

Ini adalah nilai perkiraan. Jika indeks Bitmap digunakan, nilainya mungkin berbeda dari jumlah baris yang benar-benar dipindai.

Rata-rata read_rows dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

read_bytes

bigint

Jumlah byte yang dibaca.

Rata-rata read_bytes dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

affected_rows

bigint

Jumlah baris yang terpengaruh oleh operasi DML.

Rata-rata affected_rows dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

affected_bytes

bigint

Jumlah byte yang terpengaruh oleh operasi DML.

Rata-rata affected_bytes dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

memory_bytes

bigint

Jumlah penggunaan memori puncak di semua node (perkiraan).

Ini merepresentasikan penggunaan memori puncak kumulatif di semua node eksekusi dan secara kasar mengindikasikan volume data yang dibaca.

Rata-rata memory_bytes dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

shuffle_bytes

bigint

Volume data shuffle yang diperkirakan dalam byte (perkiraan).

Ini secara kasar mengindikasikan volume transfer data jaringan.

Rata-rata shuffle_bytes dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

cpu_time_ms

bigint

Total waktu CPU dalam milidetik (ms) (perkiraan).

Ini merepresentasikan waktu CPU kumulatif di semua tugas komputasi dan secara kasar mengindikasikan kompleksitas kueri.

Rata-rata cpu_time_ms dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

physical_reads

bigint

Jumlah pembacaan fisik.

Ini mencerminkan jumlah kali batch record dibaca dari disk dan secara kasar mengindikasikan cache miss memori.

Rata-rata physical_reads dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

pid

integer

ID proses layanan kueri.

ID proses dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

application_name

text

Jenis aplikasi kueri.

Jenis aplikasi umum meliputi hal-hal berikut:

  • Alibaba Cloud Flink (VVR): {client_version}_ververica-connector-hologres.

  • Flink open source: {client_version}_hologres-connector-flink.

  • Sinkronisasi offline DataWorks Data Integration membaca dari Hologres: datax_{jobId}.

  • Sinkronisasi offline DataWorks Data Integration menulis ke Hologres: {client_version}_datax_{jobId}.

  • Sinkronisasi real-time DataWorks Data Integration: {client_version}_streamx_{jobId}.

  • Holoweb: holoweb.

  • Mengakses Hologres dari MaxCompute melalui tabel eksternal: MaxCompute.

  • SQL Auto Analyze untuk pembaruan statistik berkala: AutoAnalyze.

  • Quick BI: QuickBI_public_{version}.

  • Penjadwalan DataWorks untuk tugas Hologres: {client_version}_dwscheduler_{tenant_id}_{scheduler_id}_{scheduler_task_id}_{bizdate}_{cyctime}_{scheduler_alisa_id}, dengan:

    • client_version: Versi driver JDBC.

    • scheduler_id: Diambil dari variabel lingkungan ${SKYNET_ID}. Jika kosong, diatur ke -.

    • scheduler_task_id: Diambil dari variabel lingkungan ${SKYNET_TASKID}. Jika kosong, diatur ke -.

    • scheduler_alisa_id: Diambil dari variabel lingkungan ${ALISA_TASK_ID}. Nilai ini tidak pernah kosong.

    • bizdate: Diambil dari variabel lingkungan ${SKYNET_BIZDATE}. Jika kosong, diatur ke -.

    • cyctime: Diambil dari variabel lingkungan ${SKYNET_CYCTIME}. Jika kosong, diatur ke -.

    • tenant_id: Diambil dari variabel lingkungan ${SKYNET_TENANT_ID}. Nilai ini tidak pernah kosong.

  • Data Security Guard: dsg.

Untuk aplikasi lain, tentukan secara eksplisit application_name dalam string koneksi Hologres Anda.

Jenis aplikasi kueri.

engine_type

text[]

Mesin yang digunakan untuk kueri.

Jenis mesin meliputi hal-hal berikut:

  • HQE: Mesin native Hologres. Sebagian besar kueri menggunakan HQE untuk efisiensi eksekusi tinggi.

  • PQE: Mesin PostgreSQL. Kueri yang menggunakan PQE mengandung operator atau ekspresi yang tidak didukung secara native oleh HQE. Tulis ulang fungsi seperti yang dijelaskan dalam Optimize query performance untuk mengarahkan melalui HQE dan meningkatkan efisiensi.

  • SDK: Mesin eksekusi untuk Fixed Plan, dioptimalkan untuk SQL tipe serving seperti point reads, point writes, dan PrefixScan. Untuk detailnya, lihat Accelerate SQL execution with Fixed Plan.

    Catatan

    Mulai dari Hologres V2.2, mesin eksekusi SDK diganti namanya menjadi FixedQE.

  • PG: Komputasi lokal frontend, biasanya digunakan untuk kueri metadata pada tabel sistem. Ini tidak membaca data tabel pengguna dan mengonsumsi sumber daya sistem minimal. Perhatikan bahwa operasi DDL juga menggunakan mesin PostgreSQL.

Mesin yang digunakan oleh kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

client_addr

text

Alamat IP sumber kueri.

Ini merepresentasikan IP egress aplikasi, yang mungkin bukan IP aplikasi sebenarnya.

Alamat IP sumber dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

table_write

text

Tabel yang ditulis oleh pernyataan SQL.

Tabel yang ditulis oleh kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

table_read

text[]

Tabel yang dibaca oleh pernyataan SQL.

Tabel yang dibaca oleh kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

session_id

text

ID sesi.

ID sesi dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

session_start

timestamptz

Waktu mulai sesi.

Ini merepresentasikan kapan koneksi dibuat.

Waktu mulai sesi dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

command_id

text

ID perintah atau pernyataan.

ID perintah atau pernyataan dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

optimization_cost

integer

Waktu untuk menghasilkan rencana eksekusi kueri.

Nilai tinggi biasanya mengindikasikan SQL yang kompleks.

Biaya optimasi dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

start_query_cost

integer

Waktu startup kueri.

Nilai tinggi biasanya mengindikasikan kontensi lock atau menunggu sumber daya.

Biaya startup dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

get_next_cost

integer

Waktu eksekusi kueri.

Nilai tinggi biasanya mengindikasikan komputasi berat atau eksekusi lama. Optimalkan SQL berdasarkan kebutuhan bisnis Anda.

Biaya eksekusi dari semua kueri dalam periode agregasi untuk kunci agregasi yang sama.

extended_cost

text

Rincian waktu terperinci di luar optimization_cost, start_query_cost, dan get_next_cost.

Lihat detail waktu tambahan dalam bidang extend_cost, yang biasanya mencakup:

  • build_dag: Waktu untuk membangun DAG komputasi untuk mesin eksekusi. Saat mengakses tabel eksternal, langkah ini mengambil metadata tabel eksternal. Nilai tinggi biasanya mengindikasikan akses metadata yang lambat.

  • prepare_reqs: Waktu untuk menyiapkan permintaan bagi mesin eksekusi, termasuk menyiapkan komponen dan mengambil alamat shard. Nilai tinggi biasanya mengindikasikan respons layanan internal yang lambat untuk pencarian alamat shard.

  • serverless_allocated_cores: Alokasi sumber daya arsitektur tanpa server dalam CUs. Hanya ada untuk kueri arsitektur tanpa server.

  • serverless_allocated_workers: Jumlah worker arsitektur tanpa server yang dialokasikan. Hanya ada untuk kueri arsitektur tanpa server.

  • serverless_resource_used_time_ms: Waktu penggunaan sumber daya arsitektur tanpa server aktual dalam milidetik (ms), tidak termasuk waktu tunggu antrian.

Rincian waktu terperinci dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

plan

text

Rencana eksekusi kueri.

Panjang rencana eksekusi dibatasi hingga 102.400 karakter. Rencana yang lebih panjang mungkin dipotong. Gunakan parameter GUC log_min_duration_query_plan untuk menyesuaikan batas ini. Untuk detailnya, lihat Configuration items.

Rencana eksekusi dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

statistics

text

Statistik eksekusi kueri.

Panjang statistik dibatasi hingga 102.400 karakter. Statistik yang lebih panjang mungkin dipotong. Gunakan parameter GUC log_min_duration_query_stats untuk menyesuaikan batas ini. Untuk detailnya, lihat Configuration items.

Statistik eksekusi dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

visualization_info

text

Informasi visualisasi rencana kueri.

Informasi visualisasi rencana dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

query_detail

text

Informasi ekstensi kueri tambahan (disimpan dalam format JSON).

Catatan

Panjang informasi ekstensi dibatasi hingga 10.240 karakter. Konten yang lebih panjang mungkin dipotong.

Informasi ekstensi tambahan dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

query_extinfo

text[]

  • serverless_computing: Hanya ada untuk kueri yang dieksekusi secara eksklusif dengan sumber daya arsitektur tanpa server.

  • Informasi ekstensi kueri tambahan (disimpan dalam format ARRAY). Mulai dari V2.0.29, bidang ini menangkap ID AccessKey akun untuk membantu mengidentifikasi kepemilikan akun.

Catatan

ID AccessKey tidak direkam untuk login akun lokal, login SLR, atau login STS. Untuk akun sementara, hanya ID AccessKey sementara yang direkam.

Informasi ekstensi tambahan dari kueri pertama dalam periode agregasi untuk kunci agregasi yang sama.

calls

INT

Diatur ke 1 karena catatan detail tidak diagregasi.

Jumlah kueri dengan kunci agregasi yang sama selama periode agregasi.

agg_stats

JSONB

Kosong.

Mencatat statistik MIN, MAX, AVG, dan lainnya untuk bidang numerik (duration, memory_bytes, cpu_time_ms, physical_reads, optimization_cost, start_query_cost, get_next_cost) dari kueri dengan kunci agregasi yang sama selama periode agregasi.

extended_info

JSONB

Informasi ekstensi tambahan. Mencatat detail tentang Query Queue, Serverless Computing, dan fitur lainnya.

  • serverless_computing_source: Menunjukkan sumber SQL untuk kueri yang dieksekusi dengan sumber daya Serverless Computing. Nilainya meliputi:

    • user_submit: SQL yang secara eksplisit dikirimkan untuk dijalankan pada sumber daya arsitektur tanpa server, tidak terkait dengan Query Queue.

    • query_queue: SQL dari antrian kueri tertentu yang dieksekusi sepenuhnya pada sumber daya arsitektur tanpa server. Untuk detailnya, lihat Execute query queue queries using Serverless Computing resources.

    • query_queue_rerun: SQL yang secara otomatis dijalankan ulang pada sumber daya arsitektur tanpa server melalui fitur kontrol kueri besar Query Queue. Untuk detailnya, lihat Large query control.

  • query_id_of_triggered_rerun: Hanya ada ketika serverless_computing_source adalah query_queue_rerun. Merepresentasikan ID Kueri asli dari SQL yang dijalankan ulang.

Kosong.

Catatan

Bidang calls dan agg_stats ditambahkan di V3.0.2.

Berikan izin tampilan

Menampilkan log kueri lambat memerlukan izin tertentu. Aturan izin dan metode pemberian izin adalah sebagai berikut:

  • View slow query logs for all databases in the instance

    • Berikan izin Superuser.

      Pengguna Superuser dapat melihat semua log kueri lambat di semua database dalam instans. Untuk memberikan kemampuan ini kepada pengguna, Anda dapat memberikan izin Superuser kepada mereka.

      ALTER USER "ID akun Alibaba Cloud" SUPERUSER;-- Ganti "ID akun Alibaba Cloud" dengan username sebenarnya. Untuk Pengguna RAM, tambahkan awalan "p4_" pada ID akun.
    • Tambahkan pengguna ke grup pengguna pg_read_all_stats.

      Selain Superuser, Hologres mendukung grup pengguna pg_read_all_stats untuk melihat semua log kueri lambat dalam database. Jika pengguna biasa memerlukan akses log penuh, Superuser harus mengotorisasi mereka untuk bergabung dalam grup ini. Anda dapat menggunakan salah satu perintah berikut:

      GRANT pg_read_all_stats TO "ID akun Alibaba Cloud";-- Model otorisasi PostgreSQL standar
      CALL spm_grant('pg_read_all_stats', 'ID akun Alibaba Cloud');  -- Model izin SPM
      CALL slpm_grant('pg_read_all_stats', 'ID akun Alibaba Cloud'); -- Model izin SLPM
  • View slow query logs for the current database

    Aktifkan model izin sederhana (SPM) atau model izin sederhana tingkat skema (SLPM), lalu tambahkan pengguna ke grup pengguna db_admin. Peran db_admin dapat melihat log kueri untuk database saat ini.

    CALL spm_grant('<db_name>_admin', 'ID akun Alibaba Cloud');  -- Model izin SPM
    CALL slpm_grant('<db_name>.admin', 'ID akun Alibaba Cloud'); -- Model izin SLPM
  • Regular users can query only their own slow query logs in the current database.

Lihat kueri lambat secara visual di HoloWeb

Anda dapat melihat log kueri lambat secara visual di HoloWeb.

Catatan
  • HoloWeb saat ini mendukung penampilan log kueri lambat hingga tujuh hari.

  • Hanya Superuser yang dapat mengakses fitur ini. Pengguna biasa yang diotorisasi dapat menggunakan perintah SQL sebagai gantinya.

  1. Login ke Konsol HoloWeb. Untuk informasi selengkapnya, lihat Connect to HoloWeb and run queries.

  2. Di bilah navigasi atas, klik Diagnostics and Optimization.

  3. Di panel navigasi kiri, klik Historical Slow Query.

  4. Di halaman Historical Slow Query, edit kondisi kueri Anda.

    Untuk informasi selengkapnya tentang parameter, lihat Historical slow queries.

  5. Klik Search. Hasilnya muncul di bagian Query Trend Analysis dan Queries.

    • Query Trend Analysis

      Query Trend Analysis memvisualisasikan tren terbaru kueri lambat dan gagal. Ini membantu Anda mengidentifikasi periode frekuensi tinggi untuk troubleshooting terfokus.

    • Queries

      Query List menampilkan informasi detail tentang kueri lambat dan gagal. Untuk informasi selengkapnya tentang parameter, lihat Historical slow queries. Anda dapat mengklik Customize Columns untuk memilih kolom yang akan ditampilkan.

Sidik jari SQL

Mulai dari Hologres V2.2, tabel sistem hologres.hg_query_log mencakup kolom digest untuk menampilkan sidik jari SQL. Untuk kueri SELECT, INSERT, DELETE, dan UPDATE, sistem menghitung hash MD5 sebagai sidik jari SQL untuk membantu mengkategorikan dan menganalisis kueri.

Aturan berikut berlaku untuk pengumpulan dan perhitungan sidik jari SQL:

  • Secara default, sidik jari hanya dikumpulkan untuk kueri SELECT, INSERT, DELETE, dan UPDATE.

  • Untuk pernyataan INSERT yang memasukkan konstanta, sidik jari SQL tidak dipengaruhi oleh volume data.

  • Perhitungan sidik jari SQL mengikuti aturan sensitivitas huruf yang sama dengan pemrosesan kueri Hologres.

  • Perhitungan sidik jari SQL mengabaikan semua spasi kosong, seperti spasi, jeda baris, dan tab, serta hanya mempertimbangkan elemen struktural.

  • Perhitungan sidik jari SQL mengabaikan nilai konstanta tertentu.

    Contoh: SELECT * FROM t WHERE a > 1; dan SELECT * FROM t WHERE a > 2; menghasilkan sidik jari SQL yang identik.

  • Untuk konstanta array, perhitungan sidik jari SQL tidak dipengaruhi oleh jumlah elemen.

    Contoh: SELECT * FROM t WHERE a IN (1, 2); dan SELECT * FROM t WHERE a IN (3, 4, 5); menghasilkan sidik jari SQL yang identik.

  • Perhitungan sidik jari SQL mempertimbangkan nama database dan secara otomatis memenuhi syarat nama tabel dengan skemanya untuk membedakan tabel di berbagai konteks.

    Contoh: SELECT * FROM t; dan SELECT * FROM public.t; menghasilkan sidik jari yang identik hanya jika tabel t berada di skema public dan kedua kueri merujuk pada tabel yang sama.

Diagnosis kueri

Anda dapat mengkueri tabel hologres.hg_query_log untuk mengambil log kueri lambat. Bagian berikut menyediakan pernyataan SQL umum untuk mendiagnosis log kueri:

  • Jumlah total kueri dalam query_log

  • Kueri lambat per pengguna

  • Detail kueri lambat tertentu

  • Kueri sumber daya tinggi dalam 10 menit terakhir

  • Volume kueri per jam dan total data yang dibaca dalam 3 jam terakhir

  • Perbandingan akses data antara 3 jam terakhir dan periode yang sama kemarin

  • Kueri dengan durasi spesifik fase tinggi dalam 10 menit terakhir

  • Temukan kueri gagal pertama

  • Jumlah total kueri dalam query_log (default: data bulan lalu)

    SELECT count(*) FROM hologres.hg_query_log;

    Contoh berikut menunjukkan output, yang mengindikasikan bahwa 44 kueri melebihi ambang batas dalam sebulan terakhir:

    count
    -------
        44
    (1 row)
  • Jumlah kueri lambat per pengguna

    SELECT usename AS "User",
           count(1) as "Query count"
    FROM hologres.hg_query_log
    GROUP BY usename
    order by count(1) desc;

    Contoh berikut menunjukkan hasil eksekusi. Nilai count(1) adalah jumlah kueri.

    User                   | Query count
    -----------------------+-----
     1111111111111111      |  27
     2222222222222222      |  11
     3333333333333333      |   4
     4444444444444444      |   2
    (4 rows)
  • Detail kueri lambat tertentu

    SELECT * FROM hologres.hg_query_log WHERE query_id = '13001450118416xxxx';

    Contoh berikut menunjukkan output. Untuk informasi selengkapnya tentang bidang, lihat View the query_log table.

           usename      | status  |      query_id      | datname| command_tag | duration | message |      query_start       | query_date |                                             query                                                  | result_rows | result_bytes | read_rows |read_bytes | affected_rows | affected_bytes | memory_bytes | shuffle_bytes | cpu_time_ms | physical_reads |   pid   | application_name | engine_type |  client_addr  | table_write | table_read |   session_id   |     session_start      | command_id | optimization_cost | start_query_cost | get_next_cost | extended_cost | plan | statistics | visualization_info | query_detail | query_extinfo
    -----------------------+---------+--------------------+---------+-------------+----------+---------+------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+--------------+-----------+------------+---------------+----------------+--------------+---------------+-------------+----------------+---------+------------------+-------------+---------------+-------------+------------+-----------------+------------------------+------------+-------------------+------------------+---------------+---------------+------+------------+--------------------+--------------+---------------
     p4_11111111111xxxx | SUCCESS | 13001450118416xxxx | dbname | SELECT      |      149 |         | 2021-03-30 23:45:01+08 | 20210330   | explain analyze SELECT  * FROM tablename WHERE user_id = '20210330010xxxx' limit 1000;             |        1000 |       417172 |         0 |         0 |            -1 |             -1 |     26731376 |     476603616 |      321626 |              0 | 1984913 | psql             | {HQE}      | 33.41.xxx.xxx |             |            | 6063475a.1e4991 | 2021-03-30 23:44:26+08 | 0          |                58 |               22 |            67 |               |      |            |                    |              |
    (1 row)
  • Kueri sumber daya tinggi dalam 10 menit terakhir (Anda dapat menyesuaikan rentang waktu sesuai kebutuhan.)

    SELECT status AS "Status",
           duration AS "Duration (ms)",
           query_start AS "Start time",
           (read_bytes/1048576)::text || ' MB' AS "Data read",
           (memory_bytes/1048576)::text || ' MB' AS "Memory",
           (shuffle_bytes/1048576)::text || ' MB' AS "Shuffle",
           (cpu_time_ms/1000)::text || ' s' AS "CPU time",
           physical_reads as "Disk reads",
           query_id as "QueryID",
           query::char(30)
     FROM hologres.hg_query_log
     WHERE query_start >= now() - interval '10 min'
     ORDER BY duration DESC,
              read_bytes DESC,
              shuffle_bytes DESC,
              memory_bytes DESC,
              cpu_time_ms DESC,
              physical_reads DESC
    LIMIT 100;

    Contoh berikut menunjukkan output:

    Status   |Duration (ms)|    Start time          | Data read| Memory| Shuffle| CPU time| Disk reads|      QueryID       |             query
    ---------+-------------+------------------------+----------+-------+--------+---------+-----------+--------------------+--------------------------------
     SUCCESS |  149        | 2021-03-30 23:45:01+08 | 0 MB     | 25 MB | 454 MB | 321 s   |    0      | 13001450118416xxxx | explain analyze SELECT  * FROM
     SUCCESS |  137        | 2021-03-30 23:49:18+08 | 247 MB   | 21 MB | 213 MB | 803 s   | 7771      | 13001491818416xxxx | explain analyze SELECT  * FROM
     FAILED  |   53        | 2021-03-30 23:48:43+08 | 0 MB     | 0 MB  | 0 MB   | 0 s     |    0      | 13001484318416xxxx | SELECT ds::bigint / 0 FROM pub
    (3 rows)
  • Kueri baru dari kemarin

    • Total kueri baru dari kemarin

      SELECT
          COUNT(1)
      FROM ( SELECT DISTINCT
              t1.digest
          FROM
              hologres.hg_query_log t1
          WHERE
              t1.query_start >= CURRENT_DATE - INTERVAL '1 day'
              AND t1.query_start < CURRENT_DATE
              AND NOT EXISTS (
                  SELECT
                      1
                  FROM
                      hologres.hg_query_log t2
                  WHERE
                      t2.digest = t1.digest
                      AND t2.query_start < CURRENT_DATE - INTERVAL '1 day')
              AND digest IS NOT NULL
       ) AS a;

      Contoh berikut menunjukkan output, yang mengindikasikan bahwa ada 10 kueri baru:

      count  
      -------
          10 
      (1 row)
    • Kueri baru dari kemarin dikelompokkan berdasarkan jenis (command_tag)

      SELECT
          a.command_tag,
          COUNT(1)
      FROM ( SELECT DISTINCT
              t1.digest,
              t1.command_tag
          FROM
              hologres.hg_query_log t1
          WHERE
              t1.query_start >= CURRENT_DATE - INTERVAL '1 day'
              AND t1.query_start < CURRENT_DATE
              AND NOT EXISTS (
                  SELECT
                      1
                  FROM
                      hologres.hg_query_log t2
                  WHERE
                      t2.digest = t1.digest
                      AND t2.query_start < CURRENT_DATE - INTERVAL '1 day')
                  AND t1.digest IS NOT NULL) AS a
      GROUP BY
          1
      ORDER BY
          2 DESC;

      Hasil berikut menunjukkan bahwa 8 kueri INSERT baru dan 2 kueri SELECT baru ditambahkan kemarin.

      command_tag	| count  
      ------------+--------
      INSERT	    |    8   
      SELECT	    |    2
      (2 rows)
  • Detail kueri baru dari kemarin

    SELECT
        a.usename,
        a.status,
        a.query_id,
        a.digest, 
        a.datname,
        a.command_tag,
        a.query,
        a.cpu_time_ms,
        a.memory_bytes
    FROM (
        SELECT DISTINCT
            t1.usename,
            t1.status,
            t1.query_id,
            t1.digest, 
            t1.datname,
            t1.command_tag,
            t1.query,
            t1.cpu_time_ms,
            t1.memory_bytes
        FROM
            hologres.hg_query_log t1
        WHERE
             t1.query_start >= CURRENT_DATE - INTERVAL '1 day' 
            AND t1.query_start < CURRENT_DATE 
            AND NOT EXISTS (
                SELECT
                    1
                FROM
                    hologres.hg_query_log t2
                WHERE
                    t2.digest = t1.digest
                    AND t2.query_start < CURRENT_DATE - INTERVAL '1 day'
            )
            AND t1.digest IS NOT NULL
    ) AS a; 

    Hasil berikut dikembalikan:

    usename	         |status  |query_id	           |digest	                            |datname|command_tag	|query	                            |cpu_time_ms   |memory_bytes
    -----------------+--------+--------------------+------------------------------------+-------+-------------+-----------------------------------+--------------+--------------
    111111111111xxxx |SUCCESS |100100425827776xxxx |md58cf93d91c36c6bc9998add971458ba1a |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  | 	   		 1748|	   898808596
    111111111111xxxx |SUCCESS |100100425827965xxxx |md5f7e87e2c9e0b3d9eddcd6b3bc7f04b3b |dbname	|INSERT       |INSERT INTO xxx SELECT * FROM xxx  | 	   		59891|	  6819529886
    111111111111xxxx |SUCCESS |100100425829654xxxx |md55612dc09d2d81074fd5deed1aa3eca9b |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  |   	   		  3|	     2100039
    111111111111xxxx |SUCCESS |100100425829664xxxx |md58d3bf67fbdf2247559bc916586d40011 |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  |     		10729|	  2052861937
    111111111111xxxx |SUCCESS |100100425830099xxxx |md503bd45d6b2d7701c2617d079b4d55a10 |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  |	   		   2196|     897948034
    111111111111xxxx |SUCCESS |100100425830186xxxx |md5c62169eaf3ea3a0c59bdc834a8141ac4 |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  |	   		   5268|    1734305972
    111111111111xxxx |SUCCESS |100100425830448xxxx |md59aa0c73b24c9c9eba0b34c8fdfc23bb0 |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  |	   		      2|       2098402
    111111111111xxxx |SUCCESS |100100425830459xxxx |md57d22c1d37b68984e9472f11a4c9fd04e |dbname	|INSERT	      |INSERT INTO xxx SELECT * FROM xxx  |	   		    113|      76201984
    111111111111xxxx |SUCCESS |100100525468694xxxx |md5ac7d6556fae123e9ea9527d8f1c94b1c |dbname	|SELECT	      |SELECT * FROM xxx limit 200	      |     		    6|	     1048576
    111111111111xxxx |SUCCESS |100101025538840xxxx |md547d09cdad4d5b5da74abaf08cba79ca0 |dbname	|SELECT	      |SELECT * FROM xxx limit 200	      |\N	           |\N        
    (10 rows)
  • Tren kueri baru dari kemarin (rincian per jam)

    SELECT
        to_char(a.query_start, 'HH24') AS query_start_hour,
        a.command_tag,
        COUNT(1)
    FROM (
        SELECT DISTINCT
            t1.query_start,
            t1.digest,
            t1.command_tag
        FROM
            hologres.hg_query_log t1
        WHERE
             t1.query_start >= CURRENT_DATE - INTERVAL '1 day' 
             AND t1.query_start < CURRENT_DATE 
             AND NOT EXISTS (
                SELECT
                    1
                FROM
                    hologres.hg_query_log t2
                WHERE
                    t2.digest = t1.digest
                    AND t2.query_start < CURRENT_DATE - INTERVAL '1 day'
             )
             AND t1.digest IS NOT NULL
    ) AS a 
    GROUP BY 1, 2
    ORDER BY 
    	3 DESC; 

    Hasil eksekusi menunjukkan bahwa satu kueri SELECT ditambahkan pada pukul 11:00, satu lagi pada pukul 13:00, dan delapan kueri INSERT ditambahkan pada pukul 21:00 kemarin.

    query_start_hour	|command_tag	|count
    ------------------+-------------+-----
    	            21	|INSERT	      |    8
    	            11	|SELECT	      |    1
    	            13	|SELECT	      |    1
    (3 rows)
  • Jumlah kueri lambat berdasarkan kategori.

    SELECT
        digest,
        command_tag,
        count(1)
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= CURRENT_DATE - INTERVAL '1 day'
        AND query_start < CURRENT_DATE
    GROUP BY
        1,2
    ORDER BY
        3 DESC;
  • 10 kueri teratas berdasarkan rata-rata waktu CPU dalam sehari terakhir

    SELECT
        digest,
        avg(cpu_time_ms)
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= CURRENT_DATE - INTERVAL '1 day'
        AND query_start < CURRENT_DATE
        AND digest IS NOT NULL
        AND usename != 'system'
        AND cpu_time_ms IS NOT NULL
    GROUP BY
        1
    ORDER BY
        2 DESC
    LIMIT 10;
  • 10 kueri teratas berdasarkan rata-rata konsumsi memori dalam seminggu terakhir

    SELECT
        digest,
        avg(memory_bytes)
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= CURRENT_DATE - INTERVAL '7 day'
        AND query_start < CURRENT_DATE
        AND digest IS NOT NULL
        AND memory_bytes IS NOT NULL
    GROUP BY
        1
    ORDER BY
        2 DESC
    LIMIT 10;
  • Volume kueri per jam dan total data yang dibaca dalam 3 jam terakhir (untuk mendeteksi perubahan volume)

    SELECT
        date_trunc('hour', query_start) AS query_start,
        count(1) AS query_count,
        sum(read_bytes) AS read_bytes,
        sum(cpu_time_ms) AS cpu_time_ms
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= now() - interval '3 h'
    GROUP BY 1;
  • Perbandingan akses data antara 3 jam terakhir dan periode yang sama kemarin (untuk mendeteksi perubahan pola akses)

    SELECT
        query_date,
        count(1) AS query_count,
        sum(read_bytes) AS read_bytes,
        sum(cpu_time_ms) AS cpu_time_ms
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= now() - interval '3 h'
    GROUP BY
        query_date
    UNION ALL
    SELECT
        query_date,
        count(1) AS query_count,
        sum(read_bytes) AS read_bytes,
        sum(cpu_time_ms) AS cpu_time_ms
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= now() - interval '1d 3h'
        AND query_start <= now() - interval '1d'
    GROUP BY
        query_date;
  • Kueri dengan durasi spesifik fase tinggi dalam 10 menit terakhir (Anda dapat menyesuaikan rentang waktu sesuai kebutuhan.)

    SELECT
        status AS "Status",
        duration AS "Duration (ms)",
        optimization_cost AS "Optimization (ms)",
        start_query_cost AS "Startup (ms)",
        get_next_cost AS "Execution (ms)",
        duration - optimization_cost - start_query_cost - get_next_cost AS "Other (ms)",
        query_id AS "QueryID",
        query::char(30)
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= now() - interval '10 min'
    ORDER BY
        duration DESC,
        start_query_cost DESC,
        optimization_cost,
        get_next_cost DESC,
        duration - optimization_cost - start_query_cost - get_next_cost DESC
    LIMIT 100;

    Contoh berikut menunjukkan output:

    Status   | Duration (ms)| Optimization (ms)| Startup (ms)| Execution (ms)| Other (ms)|      QueryID       |             query
    ---------+--------------+-----------------+-------------+--------------+-----------+--------------------+--------------------------------
     SUCCESS |     4572     |          521    |          320|         3726 |            5| 6000260625679xxxx  | -- /* user: wang ip: xxx.xx.x
     SUCCESS |     1490     |          538    |           98|          846 |            8| 12000250867886xxxx | -- /* user: lisa ip: xxx.xx.x
     SUCCESS |     1230     |          502    |           95|          625 |            8| 26000512070295xxxx | -- /* user: zhang ip: xxx.xx.
    (3 rows)
  • Kueri gagal pertama

    SELECT
        status AS "Status",
        regexp_replace(message, '\n', ' ')::char(150) AS "Error message",
        duration AS "Duration (ms)",
        query_start AS "Start time",
        query_id AS "QueryID",
        query::char(100) AS "Query"
    FROM
        hologres.hg_query_log
    WHERE
        query_start BETWEEN '2021-03-25 17:00:00'::timestamptz AND '2021-03-25 17:42:00'::timestamptz + interval '2 min'
        AND status = 'FAILED'
    ORDER BY
        query_start ASC
    LIMIT 100;

    Berikut ini menunjukkan hasil eksekusi:

    Status  |                                                                     Error message                                                                           | Duration (ms)|        Start time        |     QueryID       | Query
    --------+--------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------------------+-------------------+-------
     FAILED | Query:[1070285448673xxxx] code: kActorInvokeError msg: "[holo_query_executor.cc:330 operator()] HGERR_code XX000 HGERR_msge internal error: status { c |  1460        | 2021-03-25 17:28:54+08   | 1070285448673xxxx | S...
     FAILED | Query:[1016285560553xxxx] code: kActorInvokeError msg: "[holo_query_executor.cc:330 operator()] HGERR_code XX000 HGERR_msge internal error: status { c |   131        | 2021-03-25 17:28:55+08   | 1016285560553xxxx | S...
    (2 rows)

Ubah periode retensi log kueri lambat

Mulai dari Hologres V3.0.27, Anda dapat mengubah periode retensi log kueri lambat. Anda dapat menjalankan perintah SQL berikut di tingkat database:

ALTER DATABASE <db_name> SET hg_query_log_retention_time_sec = 2592000;
  • Periode retensi ditentukan dalam detik. Rentang yang didukung adalah 3 hingga 30 hari (259.200 hingga 2.592.000 detik).

  • Periode retensi baru hanya berlaku untuk log yang baru dihasilkan. Log yang sudah ada mempertahankan pengaturan retensi aslinya.

  • Periode retensi baru hanya berlaku untuk koneksi baru.

  • Log kedaluwarsa segera setelah mencapai batas retensi. Log tersebut tidak dibersihkan secara asinkron.

Ekspor log kueri lambat

Hologres mendukung ekspor data log kueri lambat dari tabel hg_query_log ke tabel internal kustom atau tabel eksternal di MaxCompute atau OSS menggunakan pernyataan INSERT.

  • Perhatian

    Untuk mengekspor log kueri lambat secara benar dan efisien, perhatikan poin-poin berikut:

    • Akun yang mengeksekusi pernyataan INSERT INTO ... SELECT ... FROM hologres.hg_query_log; harus memiliki izin akses yang diperlukan untuk tabel hologres.hg_query_log. Untuk informasi selengkapnya, lihat Grant viewing permissions. Jika Anda ingin mengekspor log kueri lambat untuk seluruh instans, akun yang mengeksekusi perintah INSERT harus memiliki izin `Superuser` atau `pg_read_all_stats`. Jika tidak, data yang diambil dari tabel hologres.hg_query_log tidak lengkap, sehingga menghasilkan ekspor data yang tidak lengkap.

    • Parameter query_start diindeks dalam tabel log kueri lambat. Anda harus menyertakan query_start dalam klausa WHERE Anda saat mengekspor data berdasarkan rentang waktu. Ini meningkatkan performa dan mengurangi konsumsi sumber daya.

    • Saat Anda menggunakan query_start untuk memfilter rentang waktu, jangan bersarang ekspresi pada query_start karena ini mencegah hit indeks. Misalnya, alih-alih WHERE to_char(query_start, 'yyyymmdd') = '20220101';, gunakan WHERE query_start >= to_char('20220101', 'yyyy-mm-dd') and query_start < to_char('20220102', 'yyyy-mm-dd');.

  • Contoh 1: Ekspor ke tabel internal Hologres

    Anda dapat menjalankan perintah berikut di Hologres untuk mengekspor log kueri lambat ke tabel internal bernama query_log_download.

    --Hologres SQL
    CREATE TABLE query_log_download (
        usename text,
        status text,
        query_id text,
        datname text,
        command_tag text,
        duration integer,
        message text,
        query_start timestamp with time zone,
        query_date text,
        query text,
        result_rows bigint,
        result_bytes bigint,
        read_rows bigint,
        read_bytes bigint,
        affected_rows bigint,
        affected_bytes bigint,
        memory_bytes bigint,
        shuffle_bytes bigint,
        cpu_time_ms bigint,
        physical_reads bigint,
        pid integer,
        application_name text,
        engine_type text[],
        client_addr text,
        table_write text,
        table_read text[],
        session_id text,
        session_start timestamp with time zone,
        trans_id text,
        command_id text,
        optimization_cost integer,
        start_query_cost integer,
        get_next_cost integer,
        extended_cost text,
        plan text,
        statistics text,
        visualization_info text,
        query_detail text,
        query_extinfo text[]
    );
    
    INSERT INTO query_log_download SELECT
      usename,
      status,
      query_id,
      datname,
      command_tag,
      duration,
      message,
      query_start,
      query_date,
      query,
      result_rows,
      result_bytes,
      read_rows,
      read_bytes,
      affected_rows,
      affected_bytes,
      memory_bytes,
      shuffle_bytes,
      cpu_time_ms,
      physical_reads,
      pid,
      application_name,
      engine_type,
      client_addr,
      table_write,
      table_read,
      session_id,
      session_start,
      trans_id,
      command_id,
      optimization_cost,
      start_query_cost,
      get_next_cost,
      extended_cost,
      plan,
      statistics,
      visualization_info,
      query_detail,
      query_extinfo
    FROM hologres.hg_query_log
    WHERE query_start >= '2022-08-03'
      		AND query_start < '2022-08-04';
  • Contoh 2: Ekspor ke tabel eksternal MaxCompute

    1. Buat tabel tujuan di MaxCompute:

      CREATE TABLE if NOT EXISTS mc_holo_query_log (
          username STRING COMMENT 'Username of the query initiator'
          ,status STRING COMMENT 'Final query status: success or failure'
          ,query_id STRING COMMENT 'Query ID'
          ,datname STRING COMMENT 'Queried database name'
          ,command_tag STRING COMMENT 'Query type'
          ,duration BIGINT COMMENT 'Query duration in milliseconds (ms)'
          ,message STRING COMMENT 'Error message'
          ,query STRING COMMENT 'Query text'
          ,read_rows BIGINT COMMENT 'Number of rows read'
          ,read_bytes BIGINT COMMENT 'Number of bytes read'
          ,memory_bytes BIGINT COMMENT 'Peak memory consumption per node (approximate)'
          ,shuffle_bytes BIGINT COMMENT 'Estimated data shuffle volume in bytes (approximate)'
          ,cpu_time_ms BIGINT COMMENT 'Total CPU time in milliseconds (ms) (approximate)'
          ,physical_reads BIGINT COMMENT 'Number of physical reads'
          ,application_name STRING COMMENT 'Query application type'
          ,engine_type ARRAY<STRING> COMMENT 'Engines used for the query'
          ,table_write STRING COMMENT 'Table written to by SQL'
          ,table_read ARRAY<STRING> COMMENT 'Tables read by SQL'
          ,plan STRING COMMENT 'Query execution plan'
          ,optimization_cost BIGINT COMMENT 'Time to generate execution plan'
          ,start_query_cost BIGINT COMMENT 'Query startup time'
          ,get_next_cost BIGINT COMMENT 'Query execution time'
          ,extended_cost STRING COMMENT 'Detailed timing breakdown'
          ,query_detail STRING COMMENT 'Additional query extension information (JSON format)'
          ,query_extinfo ARRAY<STRING> COMMENT 'Additional query extension information (ARRAY format)'
          ,query_start STRING COMMENT 'Query start time'
          ,query_date STRING COMMENT 'Query start date'
      ) COMMENT 'hologres instance query log daily'
      PARTITIONED BY (
          ds STRING COMMENT 'stat date'
      ) LIFECYCLE 365;
      
      ALTER TABLE mc_holo_query_log ADD PARTITION (ds=20220803);
    2. Ekspor log dari Hologres ke tabel eksternal MaxCompute:

      IMPORT FOREIGN SCHEMA project_name LIMIT TO (mc_holo_query_log)
      FROM SERVER odps_server INTO public;
      
      INSERT INTO mc_holo_query_log
      SELECT
          usename AS username,
          status,
          query_id,
          datname,
          command_tag,
          duration,
          message,
          query,
          read_rows,
          read_bytes,
          memory_bytes,
          shuffle_bytes,
          cpu_time_ms,
          physical_reads,
          application_name,
          engine_type,
          table_write,
          table_read,
          plan,
          optimization_cost,
          start_query_cost,
          get_next_cost,
          extended_cost,
          query_detail,
          query_extinfo,
          query_start,
          query_date,
          '20220803'
      FROM
          hologres.hg_query_log
      WHERE
          query_start >= '2022-08-03'
          AND query_start < '2022-08-04';

Item konfigurasi

Hologres menyediakan item konfigurasi berikut untuk mencatat kueri target secara selektif.

log_min_duration_statement

  • Deskripsi:

    Parameter ini menetapkan ambang batas durasi minimum untuk mencatat kueri lambat. Secara default, Hologres mengumpulkan kueri yang memerlukan waktu lebih dari 100 ms tetapi hanya menampilkan yang melebihi 1 detik. Anda dapat menyesuaikan parameter ini untuk mengubah ambang batas tampilan. Perhatikan poin-poin berikut:

    • Perubahan hanya berlaku untuk kueri baru. Kueri yang telah dikumpulkan sebelumnya mempertahankan perilaku pencatatan aslinya.

    • Hanya Superuser yang dapat memodifikasi pengaturan ini.

    • Nilai -1 menonaktifkan pencatatan kueri. Untuk nilai positif, ambang batas minimum yang didukung adalah 100 ms.

  • Contoh:

    Pengaturan ini memungkinkan Anda mengkueri semua pernyataan SQL dari log kueri lambat yang memiliki waktu proses 250 ms atau lebih lama:

    -- Pengaturan tingkat database (memerlukan Superuser)
    ALTER DATABASE dbname SET log_min_duration_statement = '250ms';
    
    -- Pengaturan tingkat sesi (tersedia untuk pengguna biasa)
    SET log_min_duration_statement = '250ms';

log_min_duration_query_stats

  • Deskripsi:

    Parameter ini mengontrol pencatatan statistik eksekusi kueri. Secara default, statistik dicatat untuk kueri yang melebihi 10 detik. Perhatikan poin-poin berikut:

    • Memodifikasi item konfigurasi ini hanya memengaruhi kueri baru. Kueri yang telah dicatat ditampilkan berdasarkan nilai default aslinya.

    • Nilai -1 menonaktifkan pencatatan statistik.

    • Statistik mengonsumsi penyimpanan signifikan. Mencatat terlalu banyak statistik dapat memperlambat analisis kueri lambat. Anda harus mengurangi ambang batas ke nilai kurang dari 10 detik hanya saat memecahkan masalah tertentu.

  • Contoh:

    Catat statistik untuk kueri yang melebihi 20 detik:

    -- Pengaturan tingkat database (memerlukan Superuser)
    ALTER DATABASE dbname SET log_min_duration_query_stats = '20s';
    
    -- Pengaturan tingkat sesi (tersedia untuk pengguna biasa)
    SET log_min_duration_query_stats = '20s';

log_min_duration_query_plan

  • Deskripsi:

    Parameter ini mengontrol pencatatan rencana eksekusi kueri. Secara default, rencana eksekusi dicatat untuk kueri lambat yang memerlukan waktu 10 detik atau lebih lama. Perhatikan poin-poin berikut:

    • Memodifikasi item konfigurasi ini hanya memengaruhi kueri baru, sedangkan kueri yang telah dicatat tetap ditampilkan dengan nilai default aslinya.

    • Jika waktu eksekusi kueri memenuhi atau melebihi ambang batas dalam milidetik, rencana eksekusinya dicatat dalam log kueri lambat.

    • Rencana eksekusi biasanya dapat diperoleh secara instan menggunakan explain. Oleh karena itu, pencatatan persisten biasanya tidak diperlukan.

    • Nilai -1 menonaktifkan pencatatan rencana eksekusi.

  • Contoh:

    Catat rencana eksekusi untuk kueri yang melebihi 10 detik:

    -- Pengaturan tingkat database (memerlukan Superuser)
    ALTER DATABASE dbname SET log_min_duration_query_plan = '10s';
    
    -- Pengaturan tingkat sesi (tersedia untuk pengguna biasa)
    SET log_min_duration_query_plan = '10s';

FAQ

  • Masalah:

    Di Hologres V1.1, log kueri lambat tidak menampilkan jumlah baris atau baris yang dikembalikan.

  • Kemungkinan penyebab:

    Pengumpulan log kueri lambat tidak lengkap.

  • Solusi:

    Di Hologres V1.1.36 hingga V1.1.49, Anda dapat mengaktifkan pencatatan lengkap menggunakan parameter GUC berikut. Di V1.1.49 dan versi yang lebih baru, pencatatan lengkap diaktifkan secara default.

    Catatan

    Jika instans Hologres Anda menjalankan versi sebelum V1.1.36, ikuti petunjuk dalam Common upgrade preparation errors atau hubungi tim Hologres di DingTalk untuk bantuan. Untuk informasi selengkapnya, lihat How do I get more online support?.

    -- (Direkomendasikan) Pengaturan tingkat database (setel sekali per database)
    ALTER DATABASE <db_name> SET hg_experimental_force_sync_collect_execution_statistics = ON;
    
    -- Pengaturan tingkat sesi
    SET hg_experimental_force_sync_collect_execution_statistics = ON;

    Dalam perintah tersebut, db_name adalah nama database Anda.

Referensi

Untuk informasi tentang diagnosis dan manajemen kueri di instans Anda, lihat Manage queries.