Jika instans Hologres Anda merespons secara lambat atau kueri memakan waktu terlalu lama, lihat dan analisis log kueri lambat untuk mengidentifikasi masalah tersebut dengan cepat. Proses ini membantu Anda mengidentifikasi, mendiagnosis, dan menganalisis kueri yang lambat atau gagal sehingga sistem dapat dioptimalkan dan performa ditingkatkan. Topik ini menjelaskan cara melihat dan menganalisis log kueri lambat di Hologres.
Panduan versi
|
Versi Hologres |
Fitur |
Deskripsi |
|
V0.10 |
Menambahkan fitur 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, dan pernyataan SQL (seperti INSERT, SELECT, UPDATE, dan DELETE) yang berjalan lebih lama dari nilai Mulai dari Hologres V2.2.7, nilai default |
Batasan
Batasan berikut berlaku saat Anda mengkueri log kueri lambat di Hologres:
-
Log kueri lambat disimpan selama satu bulan secara default. Anda dapat mengkueri data dari periode waktu apa pun dalam rentang satu bulan tersebut.
-
Untuk memastikan stabilitas sistem dan mencegah kelebihan trafik, satu kueri dapat mengembalikan maksimal 10.000 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 gudang metadata Hologres. Pencarian log kueri lambat yang gagal tidak memengaruhi kueri bisnis 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. Tabel hg_query_log hanya mencatat pernyataan SQL yang telah selesai. Kueri yang masih berjalan tidak ditulis ke tabel ini. Perilaku ini konsisten di seluruh versi Hologres V2, V3, dan versi selanjutnya. Selain itu:
-
Setelah Anda meningkatkan instans ke V0.10, Hologres secara default mengumpulkan log untuk kueri DML lambat yang berjalan lebih dari 100 ms dan semua operasi DDL.
-
Mulai dari V3.0.2, Hologres mendukung catatan agregasi untuk operasi DML dan kueri yang berjalan kurang dari 100 ms di tabel hologres.hg_query_log.
-
Sistem mengagregasi catatan untuk kueri DQL dan DML yang berhasil yang memiliki sidik jari dan berjalan kurang dari 100 ms.
-
Kolom utama untuk agregasi adalah server_addr, usename, datname, warehouse_id, application_name, dan digest.
-
Setiap koneksi merangkum dan melaporkan data sekali per menit.
-
Tabel berikut menjelaskan bidang-bidang dalam tabel sistem hologres.hg_query_log.
|
Bidang |
Tipe data |
Deskripsi untuk catatan DML dan DQL rinci (lebih dari 100 ms) |
Deskripsi untuk catatan DML dan DQL agregasi (kurang dari 100 ms) |
|
usename |
text |
Username untuk kueri. |
Username untuk kueri. |
|
status |
text |
Status akhir kueri adalah success atau failure.
|
Status akhir kueri. Nilainya adalah SUCCESS. Data agregasi hanya mencakup catatan yang berhasil. |
|
query_id |
text |
ID kueri. ID ini unik. Kueri yang gagal selalu memiliki query_id. Kueri yang berhasil mungkin tidak memilikinya. |
ID kueri dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
digest |
text |
Kode sidik jari SQL. Untuk kueri SELECT, INSERT, DELETE, dan UPDATE, sistem menghitung nilai hash MD5 sebagai sidik jari SQL. Untuk informasi selengkapnya tentang aturan pengumpulan dan perhitungan sidik jari SQL, lihat Sidik jari SQL. Catatan
Mulai dari Hologres V2.2, kolom digest ditambahkan untuk menampilkan kode sidik jari SQL. Jika instans Anda V2.1 atau lebih awal, hubungi dukungan teknis Hologres untuk meningkatkan instans Anda. |
Kode sidik jari SQL. |
|
datname |
text |
Nama database untuk kueri. |
Nama database untuk kueri. |
|
command_tag |
text |
Jenis kueri. Meliputi:
|
Jenis kueri dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
warehouse_id |
integer |
ID gudang virtual yang digunakan untuk kueri. |
ID kelompok komputasi dari kueri pertama yang memiliki kunci agregasi utama yang sama dalam periode agregasi. |
|
warehouse_name |
integer |
Nama gudang virtual yang digunakan untuk kueri. |
Dalam periode agregasi, nama kelompok komputasi dari kueri pertama yang memiliki kunci agregasi utama yang sama. |
|
warehouse_cluster_id |
integer |
Bidang ini ditambahkan di Hologres V3.0.2. Ini adalah ID kluster dalam gudang virtual yang digunakan untuk kueri. ID kluster di setiap gudang virtual dimulai dari 1. |
ID kluster dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
duration |
integer |
Durasi kueri dalam milidetik (ms).
Secara default, sistem hanya menampilkan pernyataan DML yang berjalan lebih dari 1 detik dan semua pernyataan DDL. Anda dapat mengubah waktu pengumpulan menggunakan parameter GUC |
Durasi kueri rata-rata dari semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
message |
text |
Pesan error. |
Kosong. |
|
query_start |
timestamptz |
Waktu mulai kueri. |
Waktu mulai kueri dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
query_date |
text |
Tanggal mulai kueri. |
Tanggal mulai kueri dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
query |
text |
Konten teks kueri. Panjang maksimum kueri adalah 51.200 karakter. Kueri yang lebih panjang mungkin dipotong. |
Konten teks dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
result_rows |
bigint |
Jumlah baris yang dikembalikan. Untuk perintah INSERT, ini adalah jumlah baris yang dimasukkan. |
Nilai rata-rata result_rows untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
result_bytes |
bigint |
Jumlah byte yang dikembalikan. |
Nilai rata-rata result_bytes untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
read_rows |
bigint |
Jumlah baris data yang dibaca. Ini bukan nilai eksak. Jika indeks bitmap digunakan, nilai ini mungkin berbeda dari jumlah baris yang dipindai sebenarnya. |
Nilai rata-rata read_rows untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
read_bytes |
bigint |
Jumlah byte yang dibaca. |
Nilai rata-rata read_bytes untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
affected_rows |
bigint |
Jumlah baris yang dipengaruhi oleh pernyataan DML. |
Nilai rata-rata affected_rows untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
affected_bytes |
bigint |
Jumlah byte yang dipengaruhi oleh pernyataan DML. |
Nilai rata-rata affected_bytes untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
memory_bytes |
bigint |
Penggunaan memori puncak kumulatif di setiap node (tidak eksak). Ini merepresentasikan jumlah penggunaan memori puncak di semua node tempat kueri dijalankan. Secara kasar mencerminkan jumlah data yang dibaca oleh kueri. |
Nilai rata-rata memory_bytes untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
shuffle_bytes |
bigint |
Perkiraan jumlah byte untuk shuffle data (tidak eksak). Ini secara kasar mencerminkan jumlah data yang ditransfer melalui jaringan. |
Nilai rata-rata shuffle_bytes untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
cpu_time_ms |
bigint |
Total waktu CPU dalam milidetik (ms) (tidak eksak). Ini mencerminkan waktu CPU yang dikonsumsi oleh semua tugas komputasi. Ini adalah jumlah waktu komputasi dari beberapa core CPU dan secara kasar menunjukkan kompleksitas. |
Nilai rata-rata cpu_time_ms untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
physical_reads |
bigint |
Jumlah pembacaan fisik. Ini mencerminkan jumlah kali batch record dibaca dari disk. Secara kasar menunjukkan jumlah cache miss memori. |
Nilai rata-rata physical_reads untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
pid |
integer |
Kueri ID proses layanan. |
ID proses layanan kueri dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
application_name |
text |
Anda dapat mengkueri jenis aplikasi. Jenis aplikasi umum meliputi hal berikut:
Untuk aplikasi lain, tentukan secara eksplisit |
Jenis aplikasi kueri. |
|
engine_type |
text[] |
Mesin yang digunakan untuk kueri. Jenis mesin meliputi hal berikut:
|
Mesin yang digunakan untuk kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
client_addr |
text |
Alamat sumber kueri. Ini merepresentasikan alamat IP egress aplikasi, yang belum tentu alamat IP aplikasi sebenarnya. |
Alamat sumber dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
table_write |
text |
Tabel tempat pernyataan SQL menulis data. |
Tabel tempat kueri pertama dengan kunci agregasi utama yang sama menulis data dalam periode agregasi. |
|
table_read |
text[] |
Tabel tempat pernyataan SQL membaca data. |
Tabel tempat kueri pertama dengan kunci agregasi utama yang sama membaca data dalam periode agregasi. |
|
session_id |
text |
ID sesi. |
ID sesi dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
session_start |
timestamptz |
Waktu mulai sesi. Ini merepresentasikan waktu saat koneksi dibuat. |
Waktu mulai sesi dari semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
command_id |
text |
ID perintah atau pernyataan. |
ID perintah atau pernyataan dari semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
optimization_cost |
integer |
Waktu untuk menghasilkan rencana eksekusi kueri. Biaya tinggi biasanya berarti pernyataan SQL kompleks. |
Waktu untuk menghasilkan rencana eksekusi untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
start_query_cost |
integer |
Waktu startup kueri. Biaya tinggi biasanya berarti kueri sedang menunggu lock atau resource. |
Waktu startup kueri untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
get_next_cost |
integer |
Durasi eksekusi kueri. Biaya tinggi biasanya berarti komputasi besar dan eksekusi memakan waktu lama. Anda dapat mengoptimalkan pernyataan SQL berdasarkan kebutuhan bisnis Anda. |
Durasi eksekusi kueri untuk semua kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
extended_cost |
text |
Informasi waktu kueri terperinci lainnya. Anda dapat melihat biaya selain optimization_cost, start_query_cost, dan get_next_cost di bidang
|
Biaya terperinci lainnya dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
plan |
text |
Rencana eksekusi untuk kueri. Panjang maksimum rencana eksekusi adalah 102.400 karakter. Rencana yang lebih panjang mungkin dipotong. Anda dapat mengubah batas panjang menggunakan parameter GUC |
Rencana eksekusi untuk kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
statistics |
text |
Statistik eksekusi untuk kueri. Panjang maksimum informasi statistik adalah 102.400 karakter. Informasi yang lebih panjang mungkin dipotong. Anda dapat mengubah batas panjang menggunakan parameter GUC |
Statistik eksekusi untuk kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
visualization_info |
text |
Informasi visualisasi untuk rencana kueri. |
Informasi visualisasi rencana kueri dari kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
query_detail |
text |
Informasi tambahan lainnya tentang kueri (disimpan dalam format JSON). Catatan
Panjang maksimum informasi tambahan adalah 10.240 karakter. Informasi yang lebih panjang mungkin dipotong. |
Informasi tambahan lainnya tentang kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
query_extinfo |
text[] |
Catatan
ID AccessKey tidak direkam untuk login dengan akun lokal, Service-Linked Role (SLR), atau Security Token Service (STS). Jika Anda login dengan akun sementara, hanya ID AccessKey sementara yang direkam. |
Informasi tambahan lainnya tentang kueri pertama dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
calls |
INT |
Nilainya adalah 1 karena catatan rinci tidak memiliki perilaku agregasi. |
Jumlah kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
agg_stats |
JSONB |
Kosong. |
Mencatat nilai statistik seperti MIN, MAX, dan AVG untuk bidang numerik seperti duration, memory_bytes, cpu_time_ms, physical_reads, optimization_cost, start_query_cost, dan get_next_cost untuk kueri dengan kunci agregasi utama yang sama dalam periode agregasi. |
|
extended_info |
JSONB |
Informasi tambahan lainnya. Mencatat informasi tambahan seperti Antrian Kueri dan Komputasi Tanpa Server.
|
Kosong. |
Bidang calls dan agg_stats ditambahkan di V3.0.2.
Berikan izin
Anda memerlukan izin tertentu untuk melihat log kueri lambat. Aturan izin dan metode otorisasi adalah sebagai berikut:
-
View slow query logs for all databases in an instance.
-
Berikan izin Superuser kepada pengguna.
Akun superuser dapat melihat semua log kueri lambat untuk semua database dalam suatu instans. Setelah Anda memberikan izin superuser kepada pengguna, pengguna tersebut dapat melihat log-log ini. Saat memberikan izin, ganti "ID akun Alibaba Cloud" dengan username sebenarnya. Jika Anda menggunakan pengguna RAM, ganti ID akun Alibaba Cloud dengan "p4_AccountID". Catatan: Ini adalah ID akun, bukan nama pengguna RAM. Anda dapat menemukan ID akun di halaman akun.
ALTER USER "ID akun Alibaba Cloud" SUPERUSER; -
Tambahkan pengguna ke grup pengguna pg_read_all_stats.
Selain superuser, Hologres juga memungkinkan pengguna dalam grup pg_read_all_stats untuk melihat log kueri lambat untuk semua database. Jika pengguna biasa perlu melihat semua log, mereka dapat menghubungi superuser untuk ditambahkan ke grup ini. Perintah otorisasi adalah sebagai berikut:
GRANT pg_read_all_stats TO "ID akun Alibaba Cloud";-- Berikan izin dalam model otorisasi PostgreSQL standar CALL spm_grant('pg_read_all_stats', 'ID akun Alibaba Cloud'); -- Berikan izin dalam model izin sederhana CALL slpm_grant('pg_read_all_stats', 'ID akun Alibaba Cloud'); -- Berikan izin dalam model izin tingkat skema
-
-
View slow query logs for the current database.
Aktifkan model izin sederhana (SPM) atau model izin tingkat skema (SLPM) dan 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'); -- Berikan izin dalam model izin sederhana CALL slpm_grant('<db_name>.admin', 'ID akun Alibaba Cloud'); -- Berikan izin dalam model izin tingkat skema -
Regular users can only query the slow query logs for the queries they executed in the current database.
Lihat kueri lambat di HoloWeb
Anda dapat menggunakan HoloWeb untuk melihat log kueri lambat.
-
HoloWeb saat ini mendukung melihat log kueri lambat historis hingga tujuh hari.
-
Hanya akun Superuser yang dapat melihat informasi ini. Akun berwenang biasa harus menggunakan perintah SQL.
-
Login ke konsol HoloWeb. Untuk informasi selengkapnya, lihat Hubungkan ke HoloWeb dan jalankan kueri.
-
Di bilah navigasi atas, klik Diagnostics and Optimization.
-
Di panel navigasi kiri, klik Historical Slow Query.
-
Di bagian atas halaman Historical Slow Query, edit kondisi kueri.
Untuk deskripsi parameter, lihat Kueri Lambat Historis.
-
Klik Search. Hasil ditampilkan di area Query Trend Analysis dan Queries.
-
Query Trend Analysis
Analisis Tren Kueri menampilkan tren terbaru kueri lambat dan gagal. Anda dapat memantau periode dengan frekuensi tinggi kueri lambat untuk lebih baik mengidentifikasi dan menyelesaikan masalah.
-
Queries
Daftar Kueri menampilkan informasi terperinci tentang kueri lambat dan gagal. Untuk deskripsi parameter, lihat Kueri Lambat Historis. Anda juga dapat mengklik Customize Columns untuk memilih kolom yang ditampilkan di daftar kueri.
-
Sidik jari SQL
Mulai dari Hologres V2.2, tabel sistem hologres.hg_query_log yang menyimpan log kueri lambat, mencakup kolom digest untuk menampilkan sidik jari SQL. Untuk kueri SELECT, INSERT, DELETE, dan UPDATE, sistem menghitung nilai hash MD5 sebagai sidik jari SQL. Ini membantu Anda mengkategorikan dan menganalisis kueri.
Aturan untuk mengumpulkan dan menghitung sidik jari SQL adalah sebagai berikut:
-
Secara default, sidik jari hanya dikumpulkan untuk kueri SELECT, INSERT, DELETE, dan UPDATE.
-
Untuk pernyataan
INSERTyang memasukkan data sebagai konstanta, sidik jari SQL tidak dipengaruhi oleh volume data yang dimasukkan. -
Saat menghitung sidik jari SQL, penanganan huruf besar/kecil dalam pernyataan SQL konsisten dengan aturan Hologres untuk huruf besar/kecil dalam kueri.
-
Perhitungan mengabaikan semua karakter whitespace dalam kueri, seperti spasi, line break, dan karakter tab. Hanya mempertimbangkan informasi struktural pernyataan SQL.
-
Perhitungan mengabaikan efek nilai konstanta spesifik dalam kueri terhadap sidik jari.
Contoh: Kueri
SELECT * FROM t WHERE a > 1;danSELECT * FROM t WHERE a > 2;memiliki sidik jari SQL yang sama. -
Untuk konstanta array dalam kueri, perhitungan tidak dipengaruhi oleh jumlah elemen dalam array.
Contoh: Kueri
SELECT * FROM t WHERE a IN (1, 2);danSELECT * FROM t WHERE a IN (3, 4, 5);memiliki sidik jari SQL yang sama. -
Perhitungan mempertimbangkan nama database dan secara otomatis melengkapi properti skema untuk setiap tabel. Menggunakan nama tabel dan propertinya untuk membedakan antara tabel dalam kueri yang berbeda.
Contoh: Untuk kueri
SELECT * FROM t;danSELECT * FROM public.t;, sidik jari SQL-nya sama hanya jika tabeltberada di skemapublicdan kedua kueri merujuk ke 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:
-
Lihat volume kueri dan total data yang dibaca per jam selama 3 jam terakhir
-
Lihat volume akses data selama 3 jam terakhir dibandingkan dengan waktu yang sama kemarin
-
Kueri kueri dengan durasi tinggi di setiap tahap dari 10 menit terakhir
-
Kueri jumlah total kueri dalam query_log (default data dari bulan terakhir).
SELECT count(*) FROM hologres.hg_query_log;Hasil berikut menunjukkan bahwa 44 kueri dengan durasi lebih besar dari ambang batas yang ditentukan dieksekusi dalam bulan terakhir.
count ------- 44 (1 row) -
Kueri jumlah kueri lambat untuk setiap pengguna.
SELECT usename AS "User", count(1) as "Query Count" FROM hologres.hg_query_log GROUP BY usename order by count(1) desc;Hasil berikut dikembalikan. Satuan untuk
count(1)adalah jumlah kueri.User | Query Count -----------------------+----- 1111111111111111 | 27 2222222222222222 | 11 3333333333333333 | 4 4444444444444444 | 2 (4 rows) -
Kueri detail kueri lambat tertentu.
SELECT * FROM hologres.hg_query_log WHERE query_id = '13001450118416xxxx';Hasil berikut dikembalikan. Untuk informasi selengkapnya tentang parameter, lihat Tabel query_log.
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 kueri konsumsi tinggi dari periode waktu terbaru, seperti 10 menit terakhir. Anda juga dapat mengubah periode waktu untuk mengkueri kueri konsumsi tinggi untuk durasi tertentu 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;Hasil berikut dikembalikan:
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) -
Lihat jumlah kueri baru dari kemarin.
-
Hitung jumlah 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;Hasil berikut menunjukkan bahwa total 10 kueri baru ditambahkan kemarin.
count ------- 10 (1 row) -
Grup dan hitung jumlah kueri baru dari kemarin berdasarkan jenis kueri (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)
-
-
Lihat 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) -
Lihat tren kueri baru dari kemarin (ditampilkan 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 berikut menunjukkan bahwa pada pukul 11.00, 13.00, dan 21.00 kemarin, masing-masing ditambahkan 1 kueri SELECT, 1 kueri SELECT, dan 8 kueri INSERT.
query_start_hour |command_tag |count ------------------+-------------+----- 21 |INSERT | 8 11 |SELECT | 1 13 |SELECT | 1 (3 rows) -
Jumlah kueri lambat yang dikategorikan.
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; -
Kueri 10 kueri teratas dengan waktu CPU rata-rata tertinggi dalam satu hari 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; -
Lihat 10 kueri teratas dengan konsumsi memori rata-rata tertinggi (memory_bytes) dalam satu minggu 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; -
Lihat volume kueri dan total data yang dibaca per jam selama 3 jam terakhir untuk memeriksa perubahan volume data.
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; -
Lihat volume akses data selama 3 jam terakhir dibandingkan dengan waktu yang sama kemarin untuk memeriksa perubahan volume akses data.
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 kueri dengan durasi tinggi di setiap tahap dari periode waktu terbaru, seperti 10 menit terakhir. Anda juga dapat mengubah periode waktu untuk mengkueri kueri dengan durasi tinggi di setiap tahap untuk durasi tertentu sesuai kebutuhan.
SELECT status AS "Status", duration AS "Duration (ms)", optimization_cost AS "Optimization Cost (ms)", start_query_cost AS "Startup Cost (ms)", get_next_cost AS "Execution Cost (ms)", duration - optimization_cost - start_query_cost - get_next_cost AS "Other Cost (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;Hasil berikut dikembalikan:
Status | Duration (ms) | Optimization Cost (ms) | Startup Cost (ms) | Execution Cost (ms) | Other Cost (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 pertama yang gagal.
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;Hasil berikut dikembalikan:
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 siklus hidup log kueri lambat
Mulai dari Hologres V3.0.27, Anda dapat mengubah siklus hidup log kueri lambat. Anda dapat menjalankan pernyataan SQL berikut untuk membuat perubahan di tingkat database:
ALTER DATABASE <db_name> SET hg_query_log_retention_time_sec = 2592000;
-
Parameter dalam satuan detik. Anda dapat mengatur siklus hidup ke nilai antara 3 hingga 30 hari, yang sesuai dengan rentang 259.200 hingga 2.592.000 detik.
-
Siklus hidup yang dimodifikasi hanya berlaku untuk log baru. Log yang sudah ada tetap mengikuti konfigurasi sebelumnya.
-
Siklus hidup yang dimodifikasi hanya berlaku untuk koneksi baru.
-
Setelah Anda mengatur siklus hidup dengan parameter ini, log yang kedaluwarsa dibersihkan segera, bukan secara asinkron.
Ekspor log kueri lambat
Hologres memungkinkan Anda menggunakan pernyataan INSERT untuk mengekspor data dari log kueri lambat (hg_query_log) ke tabel internal kustom Anda atau ke tabel eksternal seperti MaxCompute atau OSS.
-
Catatan
Untuk mengekspor data dari log kueri lambat dengan benar dan efisien, perhatikan hal berikut:
-
Akun yang menjalankan
INSERT INTO ... SELECT ... FROM hologres.hg_query_log;harus memiliki izin akses yang diperlukan untuk tabelhologres.hg_query_log. Untuk informasi selengkapnya, lihat Berikan izin. Untuk mengekspor log kueri lambat untuk seluruh instans, akun yang menjalankan perintahINSERTharus memiliki izin superuser atau pg_read_all_stats. Jika tidak, data yang dikueri dari tabelhologres.hg_query_logakan tidak lengkap, dan data yang diekspor juga akan tidak lengkap. -
query_start adalah indeks tabel log kueri lambat. Untuk mengekspor data untuk rentang waktu tertentu, sertakan kolom
query_startdalam kondisi kueri Anda. Ini meningkatkan performa dan mengurangi konsumsi resource. -
Saat Anda menggunakan
query_startuntuk memfilter berdasarkan rentang waktu, jangan gunakan ekspresi bersarang padaquery_start. Ini mencegah indeks terkena. Misalnya, cara yang lebih baik untuk menulisWHERE to_char(query_start, 'yyyymmdd') = '20220101';adalah: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.
Jalankan perintah berikut di Hologres untuk mengekspor log kueri lambat ke tabel internal 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.
-
Jalankan perintah berikut di MaxCompute untuk membuat tabel untuk menerima data.
CREATE TABLE if NOT EXISTS mc_holo_query_log ( username STRING COMMENT 'Username untuk kueri' ,status STRING COMMENT 'Status akhir kueri: success atau failed' ,query_id STRING COMMENT 'ID kueri' ,datname STRING COMMENT 'Nama database untuk kueri' ,command_tag STRING COMMENT 'Jenis kueri' ,duration BIGINT COMMENT 'Durasi kueri dalam milidetik (ms)' ,message STRING COMMENT 'Pesan error' ,query STRING COMMENT 'Konten teks kueri' ,read_rows BIGINT COMMENT 'Jumlah baris yang dibaca oleh kueri' ,read_bytes BIGINT COMMENT 'Jumlah byte yang dibaca oleh kueri' ,memory_bytes BIGINT COMMENT 'Konsumsi memori puncak pada satu node (tidak eksak)' ,shuffle_bytes BIGINT COMMENT 'Perkiraan jumlah byte untuk shuffle data (tidak eksak)' ,cpu_time_ms BIGINT COMMENT 'Total waktu CPU dalam milidetik (tidak eksak)' ,physical_reads BIGINT COMMENT 'Jumlah pembacaan fisik' ,application_name STRING COMMENT 'Jenis aplikasi kueri' ,engine_type ARRAY<STRING> COMMENT 'Mesin yang digunakan untuk kueri' ,table_write STRING COMMENT 'Tabel tempat pernyataan SQL menulis data' ,table_read ARRAY<STRING> COMMENT 'Tabel tempat pernyataan SQL membaca data' ,plan STRING COMMENT 'Rencana eksekusi untuk kueri' ,optimization_cost BIGINT COMMENT 'Waktu untuk menghasilkan rencana eksekusi kueri' ,start_query_cost BIGINT COMMENT 'Waktu startup kueri' ,get_next_cost BIGINT COMMENT 'Durasi eksekusi kueri' ,extended_cost STRING COMMENT 'Biaya terperinci lainnya dari kueri' ,query_detail STRING COMMENT 'Informasi tambahan lainnya tentang kueri (disimpan dalam format JSON)' ,query_extinfo ARRAY<STRING> COMMENT 'Informasi tambahan lainnya tentang kueri (disimpan dalam format ARRAY)' ,query_start STRING COMMENT 'Waktu mulai kueri' ,query_date STRING COMMENT 'Tanggal mulai kueri' ) COMMENT 'log kueri harian instans hologres' PARTITIONED BY ( ds STRING COMMENT 'tanggal stat' ) LIFECYCLE 365; ALTER TABLE mc_holo_query_log ADD PARTITION (ds=20220803); -
Jalankan perintah berikut di Hologres untuk mengekspor log kueri lambat 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 membantu Anda mencatat kueri tertentu.
log_min_duration_statement
-
Deskripsi:
Item ini menentukan durasi minimum agar kueri dicatat sebagai kueri lambat. Secara default, sistem mengumpulkan kueri yang berjalan lebih dari 100 ms, tetapi hanya kueri yang berjalan lebih dari 1 detik yang ditampilkan. Anda dapat menggunakan item ini untuk mengubah ambang batas tampilan. Catatan:
-
Perubahan pada item ini hanya berlaku untuk kueri baru. Kueri yang telah dikumpulkan sebelumnya ditampilkan berdasarkan nilai default asli.
-
Hanya superuser yang dapat mengubah pengaturan ini.
-
Atur ke
-1untuk menghentikan pencatatan kueri apa pun. Jika Anda mengatur ke angka positif, nilai minimum adalah 100 ms.
-
-
Contoh:
Atur ambang batas sehingga semua pernyataan SQL yang berjalan selama
250 msatau lebih lama dicatat dan dapat dikueri:-- Atur di tingkat DB (memerlukan superuser) ALTER DATABASE dbname SET log_min_duration_statement = '250ms'; -- Atur di tingkat sesi saat ini (dapat dijalankan oleh pengguna biasa) SET log_min_duration_statement = '250ms';
log_min_duration_query_stats
-
Deskripsi:
Item ini mencatat statistik eksekusi kueri. Secara default, sistem mencatat statistik untuk kueri yang berjalan lebih dari 10 detik. Catatan:
-
Perubahan pada item ini hanya berlaku untuk kueri baru. Kueri yang telah direkam sebelumnya ditampilkan berdasarkan nilai default asli.
-
Atur ke
-1untuk menghentikan pencatatan statistik kueri. -
Informasi ini memerlukan banyak penyimpanan. Mencatat terlalu banyak informasi dapat memperlambat analisis log kueri lambat. Oleh karena itu, Anda dapat mengatur ke kurang dari 10 detik saat troubleshooting masalah tertentu. Jika tidak, jangan atur ke nilai yang lebih kecil.
-
-
Contoh:
Atur sistem untuk mencatat statistik untuk kueri yang berjalan lebih dari 20 detik:
--Atur di tingkat DB (memerlukan superuser) ALTER DATABASE dbname SET log_min_duration_query_stats = '20s'; -- Atur di tingkat sesi saat ini (dapat dijalankan oleh pengguna biasa) SET log_min_duration_query_stats = '20s';
log_min_duration_query_plan
-
Deskripsi:
Item ini mencatat informasi rencana eksekusi untuk kueri. Secara default, sistem menampilkan rencana eksekusi untuk log kueri lambat yang berdurasi 10 detik atau lebih lama. Catatan:
-
Perubahan pada item ini hanya berlaku untuk kueri baru. Kueri yang telah direkam sebelumnya ditampilkan berdasarkan nilai default asli.
-
Jika waktu eksekusi pernyataan lebih besar dari atau sama dengan jumlah milidetik yang ditetapkan, rencana eksekusinya dicatat dalam log kueri lambat.
-
Secara umum, Anda dapat langsung mendapatkan rencana eksekusi menggunakan
EXPLAIN. Anda tidak perlu mencatatnya secara terpisah. -
Atur ke
-1untuk menghentikan pencatatan rencana eksekusi kueri.
-
-
Contoh:
Atur sistem untuk mencatat rencana eksekusi untuk log kueri yang berdurasi lebih dari 10 detik:
-- Atur di tingkat DB (memerlukan superuser) ALTER DATABASE dbname SET log_min_duration_query_plan = '10s'; -- Atur di tingkat sesi saat ini (dapat dijalankan oleh pengguna biasa) SET log_min_duration_query_plan = '10s';
FAQ
-
Gejala:
Saat melihat log kueri lambat di Hologres V1.1, informasi seperti jumlah baris yang dikueri dan jumlah baris yang dikembalikan tidak ditampilkan.
-
Penyebab:
Pengumpulan log kueri lambat tidak lengkap.
-
Solusi:
Di Hologres V1.1.36 hingga V1.1.49, Anda dapat menggunakan parameter GUC berikut untuk menampilkan informasi lengkap. Informasi ini ditampilkan secara default di Hologres V1.1.49 dan versi selanjutnya.
CatatanJika instans Hologres Anda lebih awal dari V1.1.36, lihat Kesalahan persiapan peningkatan umum atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi selengkapnya, lihat Bagaimana cara mendapatkan dukungan online lebih lanjut?.
-- (Direkomendasikan) Di tingkat database, atur sekali per database. ALTER DATABASE <db_name> SET hg_experimental_force_sync_collect_execution_statistics = ON; -- Di tingkat sesi SET hg_experimental_force_sync_collect_execution_statistics = ON;db_name adalah nama database.
Referensi
Untuk mendiagnosis dan mengelola kueri di instans Anda, lihat Kelola kueri.