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. |
|
|
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 Mulai dari Hologres V2.2.7, nilai default |
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.
|
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:
|
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
Secara default, sistem menampilkan kueri DML yang lebih lama dari 1 detik dan semua kueri DDL. Gunakan parameter GUC |
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:
Untuk aplikasi lain, tentukan secara eksplisit |
Jenis aplikasi kueri. |
|
engine_type |
text[] |
Mesin yang digunakan untuk kueri. Jenis mesin meliputi hal-hal berikut:
|
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
|
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 |
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 |
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[] |
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.
|
Kosong. |
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.
-
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.
-
Login ke Konsol HoloWeb. Untuk informasi selengkapnya, lihat Connect to HoloWeb and run queries.
-
Di bilah navigasi atas, klik Diagnostics and Optimization.
-
Di panel navigasi kiri, klik Historical Slow Query.
-
Di halaman Historical Slow Query, edit kondisi kueri Anda.
Untuk informasi selengkapnya tentang parameter, lihat Historical slow queries.
-
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
INSERTyang 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;danSELECT * 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);danSELECT * 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;danSELECT * FROM public.t;menghasilkan sidik jari yang identik hanya jika tabeltberada di skemapublicdan 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:
-
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
-
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
INSERTbaru dan 2 kueriSELECTbaru 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 tabelhologres.hg_query_log. Untuk informasi selengkapnya, lihat Grant viewing permissions. Jika Anda ingin mengekspor log kueri lambat untuk seluruh instans, akun yang mengeksekusi perintahINSERTharus memiliki izin `Superuser` atau `pg_read_all_stats`. Jika tidak, data yang diambil dari tabelhologres.hg_query_logtidak lengkap, sehingga menghasilkan ekspor data yang tidak lengkap. -
Parameter query_start diindeks dalam tabel log kueri lambat. Anda harus menyertakan
query_startdalam klausa WHERE Anda saat mengekspor data berdasarkan rentang waktu. Ini meningkatkan performa dan mengurangi konsumsi sumber daya. -
Saat Anda menggunakan
query_startuntuk memfilter rentang waktu, jangan bersarang ekspresi padaquery_startkarena ini mencegah hit indeks. Misalnya, alih-alihWHERE to_char(query_start, 'yyyymmdd') = '20220101';, gunakanWHERE 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
-
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); -
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
-1menonaktifkan 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 msatau 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
-1menonaktifkan 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
-1menonaktifkan 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.
CatatanJika 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.