全部产品
Search
文档中心

Hologres:Lihat dan analisis log kueri lambat

更新时间:Feb 15, 2026

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.

  • Fitur ini hanya tersedia di Hologres V0.10 dan versi selanjutnya. Periksa versi instans Anda di halaman produk instans di Konsol Hologres. Jika instans Anda lebih awal dari V0.10, 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?.

  • Di Hologres V0.10, log untuk kueri FAILED tidak menampilkan statistik runtime seperti 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, dan pernyataan SQL (seperti INSERT, SELECT, UPDATE, dan DELETE) yang berjalan lebih lama dari nilai log_min_duration_statement.

Mulai dari Hologres V2.2.7, nilai default log_min_duration_statement dioptimalkan dari 1 detik menjadi 100 ms. Anda tidak perlu mengubahnya secara manual. Jika instans Anda lebih awal dari V2.2.7, Anda dapat mengubah nilainya secara manual menggunakan log_min_duration_statement. Nilai minimum adalah 100 ms.

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.

  • SUCCESS

  • FAILED

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:

  • DML: COPY, DELETE, INSERT, SELECT, UPDATE, dan lainnya.

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

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

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).

duration merepresentasikan total waktu pernyataan SQL, yang mencakup:

  • Optimization Cost: Waktu untuk menghasilkan rencana eksekusi. Biaya tinggi biasanya berarti pernyataan SQL kompleks.

  • Start Query Cost: Waktu startup kueri. Biaya tinggi biasanya berarti kueri sedang menunggu lock atau resource.

  • Get Result Cost: Waktu eksekusi kueri. Biaya tinggi biasanya berarti komputasi besar dan eksekusi memakan waktu lama. Anda dapat mengoptimalkan pernyataan SQL berdasarkan kebutuhan bisnis Anda.

  • Biaya lainnya: Anda dapat melihat biaya lainnya di bidang extend_cost. Ini biasanya mencakup hal berikut:

    • build_dag: Waktu untuk membangun grafik asiklik terarah (DAG) komputasi yang diperlukan oleh mesin eksekusi. Misalnya, saat mengakses tabel eksternal, langkah ini mendapatkan metadata tabel eksternal tersebut. Biaya tinggi biasanya berarti waktu akses metadata tabel eksternal lama.

    • prepare_reqs: Waktu untuk menyiapkan permintaan yang akan dikirim ke mesin eksekusi. Ini mencakup penyiapan komponen untuk menjalankan dan mendapatkan alamat setiap shard. Biaya tinggi biasanya berarti waktu untuk mendapatkan alamat shard dari layanan internal lama.

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 log_min_duration_statement. Untuk informasi selengkapnya, lihat Item konfigurasi.

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:

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

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

  • Integrasi data DataWorks untuk sinkronisasi baca offline dari Hologres: datax_{jobId}.

  • Integrasi data DataWorks untuk sinkronisasi tulis offline ke Hologres: {client_version}_datax_{jobId}.

  • Integrasi data DataWorks untuk sinkronisasi real-time: {client_version}_streamx_{jobId}.

  • HoloWeb: holoweb.

  • Mengakses Hologres melalui tabel eksternal di MaxCompute: MaxCompute.

  • SQL yang dipicu oleh Auto Analyze untuk memperbarui statistik secara 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}, di mana:

    • client_version: Versi driver JDBC.

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

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

    • scheduler_alisa_id: Diperoleh dari variabel lingkungan ${ALISA_TASK_ID}. Ini tidak pernah kosong.

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

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

    • tenant_id: Diperoleh dari variabel lingkungan ${SKYNET_TENANT_ID}. Ini tidak pernah kosong.

  • Data Security Guard: dsg.

Untuk aplikasi lain, tentukan secara eksplisit application_name dalam string koneksi saat menghubungkan ke Hologres.

Jenis aplikasi kueri.

engine_type

text[]

Mesin yang digunakan untuk kueri.

Jenis mesin meliputi hal berikut:

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

  • PQE: Mesin PostgreSQL. Kehadiran PQE berarti beberapa operator SQL dieksekusi di PQE, biasanya karena tidak didukung secara native oleh HQE. Anda dapat menulis ulang fungsi seperti yang dijelaskan di Optimalkan performa kueri untuk menggunakan HQE dan meningkatkan efisiensi.

  • SDK: Mesin eksekusi untuk Fixed Plan. Dapat mengeksekusi SQL tipe serving seperti point reads, point writes, dan PrefixScan secara efisien. Untuk informasi selengkapnya, lihat Percepat eksekusi SQL dengan Fixed Plan.

    Catatan

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

  • PG: Komputasi lokal frontend. Ini umumnya digunakan untuk kueri metadata pada tabel sistem dan tidak membaca data tabel pengguna. Mengonsumsi sangat sedikit resource sistem. Perhatikan bahwa pernyataan DDL juga menggunakan mesin PostgreSQL.

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 extend_cost. Ini biasanya mencakup biaya berikut.

  • build_dag: Waktu untuk membangun DAG komputasi yang diperlukan oleh mesin eksekusi. Misalnya, saat mengakses tabel eksternal, langkah ini mendapatkan metadata tabel eksternal tersebut. Biaya tinggi biasanya berarti waktu akses metadata tabel eksternal lama.

  • prepare_reqs: Waktu untuk menyiapkan permintaan yang akan dikirim ke mesin eksekusi. Ini mencakup penyiapan komponen untuk menjalankan dan mendapatkan alamat setiap shard. Biaya tinggi biasanya berarti waktu untuk mendapatkan alamat shard dari layanan internal lama.

  • serverless_allocated_cores: Jumlah resource Serverless yang diminta (dalam CUs). Bidang ini hanya ada untuk kueri Serverless.

  • serverless_allocated_workers: Jumlah worker resource Serverless yang diminta. Bidang ini hanya ada untuk kueri Serverless.

  • serverless_resource_used_time_ms: Waktu aktual resource Serverless digunakan untuk mengeksekusi kueri, tidak termasuk waktu antrian resource. Satuan: milidetik (ms).

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 log_min_duration_query_plan. Untuk informasi selengkapnya, lihat Item konfigurasi.

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 log_min_duration_query_stats. Untuk informasi selengkapnya, lihat Item konfigurasi.

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[]

  • serverless_computing: Bidang ini hanya ada untuk kueri yang dieksekusi menggunakan resource Serverless.

  • Informasi tambahan lainnya tentang kueri (disimpan dalam format ARRAY). Mulai dari V2.0.29, bidang query_extinfo mengumpulkan ID AccessKey akun untuk membantu mengidentifikasi pemilik akun.

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.

  • serverless_computing_source: Sumber pernyataan SQL. Menunjukkan bahwa pernyataan SQL dieksekusi menggunakan resource Komputasi Tanpa Server. Nilai valid:

    • user_submit: Pernyataan SQL secara manual ditentukan untuk dijalankan menggunakan resource tanpa server, terlepas dari Antrian Kueri.

    • query_queue: Semua pernyataan SQL dalam antrian kueri tertentu dieksekusi oleh resource tanpa server. Untuk informasi selengkapnya, lihat Gunakan resource Komputasi Tanpa Server untuk mengeksekusi kueri dalam antrian kueri.

    • query_queue_rerun: Pernyataan SQL secara otomatis dijalankan ulang menggunakan resource tanpa server oleh fitur kontrol kueri besar Antrian Kueri. Untuk informasi selengkapnya, lihat Kontrol kueri besar.

  • query_id_of_triggered_rerun: Bidang ini hanya ada ketika serverless_computing_source adalah query_queue_rerun. Menunjukkan ID kueri asli dari pernyataan SQL yang dijalankan ulang.

Kosong.

Catatan

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.

Catatan
  • 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.

  1. Login ke konsol HoloWeb. Untuk informasi selengkapnya, lihat Hubungkan ke HoloWeb dan jalankan kueri.

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

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

  4. Di bagian atas halaman Historical Slow Query, edit kondisi kueri.

    Untuk deskripsi parameter, lihat Kueri Lambat Historis.

  5. 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 INSERT yang 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; dan SELECT * 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); dan SELECT * 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; dan SELECT * FROM public.t;, sidik jari SQL-nya sama hanya jika tabel t berada di skema public dan 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:

  • Kueri jumlah total kueri dalam query_log

  • Kueri jumlah kueri lambat untuk setiap pengguna

  • Kueri detail kueri lambat tertentu

  • Kueri kueri konsumsi tinggi dari 10 menit terakhir

  • 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 pertama yang gagal

  • 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 INSERT baru dan 2 kueri SELECT baru 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 tabel hologres.hg_query_log. Untuk informasi selengkapnya, lihat Berikan izin. Untuk mengekspor log kueri lambat untuk seluruh instans, akun yang menjalankan perintah INSERT harus memiliki izin superuser atau pg_read_all_stats. Jika tidak, data yang dikueri dari tabel hologres.hg_query_log akan 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_start dalam kondisi kueri Anda. Ini meningkatkan performa dan mengurangi konsumsi resource.

    • Saat Anda menggunakan query_start untuk memfilter berdasarkan rentang waktu, jangan gunakan ekspresi bersarang pada query_start. Ini mencegah indeks terkena. Misalnya, cara yang lebih baik untuk menulis WHERE 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.

    1. 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);
    2. 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 -1 untuk 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 ms atau 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 -1 untuk 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 -1 untuk 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.

    Catatan

    Jika 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.