Pelajari cara mendiagnosis dan mengelola kueri dalam suatu instans.
Ikhtisar
Hologres kompatibel dengan PostgreSQL. Anda dapat menggunakan tampilan hg_stat_activity (pg_stat_activity) untuk memantau informasi waktu proses kueri dalam suatu instans guna analisis dan diagnostik. Topik ini mencakup operasi berikut:
Tampilan hg_stat_activity (pg_stat_activity): Lihat informasi waktu proses SQL untuk mengelola pernyataan SQL secara lebih baik.
Kelola kueri aktif di HoloWeb: Gunakan Konsol HoloWeb untuk melihat dan mengelola kueri aktif.
Troubleshooting lock: Gunakan kueri aktif untuk mengidentifikasi apakah suatu pernyataan SQL sedang memegang lock atau diblokir olehnya.
Hentikan kueri: Gunakan perintah untuk menghentikan kueri yang tidak berjalan sesuai harapan.
Ubah timeout untuk kueri aktif: Ubah timeout eksekusi untuk kueri aktif guna mencegah deadlock.
Ubah timeout untuk kueri idle: Ubah timeout untuk kueri idle guna mencegah deadlock.
Kueri log kueri lambat: Gunakan log kueri lambat untuk mendiagnosis, menganalisis, dan mengoptimalkan kueri yang lambat atau gagal.
FAQ: Penyebab dan solusi untuk error
ERROR: canceling statement due to statement timeout.
Hologres tidak mendukung pengaturan batas penggunaan memori atau CPU untuk satu kueri. Untuk mengontrol resource bagi kueri, kami menyarankan Anda menggunakan query queue untuk mengelola dan menjadwalkan resource bagi seluruh workload.
Lihat kueri aktif menggunakan SQL
Jika Anda lebih suka melihat kueri aktif menggunakan SQL, Anda dapat menggunakan pernyataan berikut:
Lihat kueri aktif, tahap eksekusinya, dan konsumsi resource.
CatatanSuperuser dapat melihat informasi waktu proses untuk semua pengguna, sedangkan pengguna lain hanya dapat melihat milik mereka sendiri.
-- Untuk Hologres V2.0 dan versi lebih baru SELECT query,state,query_id,transaction_id,running_info, extend_info FROM hg_stat_activity WHERE state = 'active' AND backend_type = 'client backend' AND application_name != 'hologres' -- Untuk Hologres V1.3 dan versi lebih lama SELECT query,state,pid FROM pg_stat_activity WHERE state = 'active' AND backend_type = 'client backend' AND application_name != 'hologres'Contoh hasil:
------------------------------------------------------------------------------- query | insert into test_hg_stat_activity select i, (i % 7) :: text, (i % 1007) from generate_series(1, 10000000)i; state | active query_id | 100713xxxx transaction_id | 100713xxxx running_info | {"current_stage" : {"stage_duration_ms" :5994, "stage_name" :"EXECUTE" }, "engine_type" :"{HQE,PQE}", "fe_id" :1, "warehouse_id" :0 } extend_info | {"affected_rows" :9510912, "scanned_rows" :9527296 }Urutkan kueri yang sedang berjalan berdasarkan konsumsi CPU.
-- Untuk Hologres V2.0 dan versi lebih baru SELECT query,((extend_info::json)->'total_cpu_max_time_ms')::text::bigint AS cpu_cost,state,query_id,transaction_id FROM hg_stat_activity WHERE state = 'active' ORDER BY 2 DESC;Contoh hasil:
--------------------------------------------------------------------------------- query | select xxxxx cpu_cost | 523461 state | active query_id | 10053xxxx transaction_id | 10053xxxx --------------------------------------------------------------------------------- query | insert xxxx cpu_cost | 4817 state | active query_id | 1008305xxx transaction_id | 1008305xxxUrutkan kueri yang sedang berjalan berdasarkan konsumsi memori.
-- Untuk Hologres V2.0 dan versi lebih baru SELECT query,((extend_info::json)->'total_mem_max_bytes')::text::bigint AS mem_max_cost,state,query_id,transaction_id FROM hg_stat_activity WHERE state = 'active' ORDER BY 2 DESC;Contoh hasil:
--------------------------------------------------------------------------------- query | update xxxx; mem_max_cost | 5727634542 state | active query_id | 10053302784827629 transaction_id | 10053302784827629 --------------------------------------------------------------------------------- query | select xxxx; mem_max_cost | 19535640 state | active query_id | 10083259096119559 transaction_id | 10083259096119559Lihat kueri berdurasi panjang dalam instans saat ini.
-- Untuk Hologres V2.0 dan versi lebih baru SELECT current_timestamp - query_start AS runtime, datname::text, usename, query, query_id FROM hg_stat_activity WHERE state != 'idle' AND backend_type = 'client backend' AND application_name != 'hologres' ORDER BY 1 DESC; -- Untuk Hologres V1.3 dan versi lebih lama SELECT current_timestamp - query_start AS runtime, datname::text, usename, query, pid FROM pg_stat_activity WHERE state != 'idle' AND backend_type = 'client backend' AND application_name != 'hologres' ORDER BY 1 DESC;Contoh hasil:
runtime | datname | usename | query_id | current_query -----------------+----------------+----------+------------------------------------ 00:00:24.258388 | holotest | 123xxx | 1267xx | UPDATE xxx; 00:00:1.186394 | testdb | 156xx | 1783xx | select xxxx;Hasil tersebut menunjukkan bahwa pernyataan
UPDATEtelah berjalan selama 24 detik tanpa selesai.
Kelola kueri aktif di HoloWeb
Anda dapat melihat dan mengelola kueri aktif di Konsol HoloWeb.
Masuk ke Konsol HoloWeb. Untuk informasi lebih lanjut, lihat Hubungkan ke HoloWeb dan jalankan kueri.
Di bilah navigasi atas, klik Diagnostics and Optimization.
Di panel navigasi kiri, pilih Management for Information About Active Queries > Active Query Tasks.
Di halaman Active Query Tasks, klik Search untuk melihat dan mengelola kueri aktif pada instans saat ini.
Daftar hasil mencakup informasi berikut:
Parameter
Deskripsi
Query start
Kapan kueri dimulai.
Runtime
Waktu eksekusi kueri.
PID
ID proses (PID) layanan yang menangani kueri.
Query
Pernyataan SQL yang dieksekusi.
State
Status koneksi saat ini. Status umum meliputi:
active: Kueri sedang berjalan.
idle: Koneksi dalam keadaan idle.
idle in transaction: Koneksi idle dalam transaksi.
idle in transaction (Aborted): Koneksi idle dalam transaksi yang gagal.
\N: Status null. Biasanya menunjukkan proses maintenance latar belakang sistem, bukan koneksi pengguna, dan dapat diabaikan.
User name
Username untuk koneksi saat ini.
Application
Aplikasi yang memulai kueri.
Client address
Alamat IP klien.
Untuk menghentikan kueri berdurasi panjang, klik Cancel di kolom Actions-nya. Anda juga dapat memilih beberapa kueri dan klik Batch Cancel.
(Opsional) Klik Details di kolom Actions untuk suatu kueri guna melihat informasi detailnya.
Di halaman Details, Anda dapat melakukan operasi berikut:
Copy: Salin pernyataan SQL yang dieksekusi oleh kueri.
Format: Format pernyataan SQL yang dieksekusi oleh kueri.
Troubleshoot locks
Anda dapat memeriksa kueri aktif untuk menentukan apakah suatu pernyataan SQL sedang memegang lock atau diblokir olehnya. Untuk informasi lebih lanjut, lihat Locks and lock troubleshooting.
Hentikan kueri
Untuk menghentikan kueri yang tidak berjalan sesuai harapan, gunakan perintah berikut.
Untuk menghentikan satu kueri:
SELECT pg_cancel_backend(<pid>);Untuk menghentikan beberapa kueri secara batch:
SELECT pg_cancel_backend(pid) ,query ,datname ,usename ,application_name ,client_addr ,client_port ,backend_start ,state FROM pg_stat_activity WHERE length(query) > 0 AND pid != pg_backend_pid() AND backend_type = 'client backend' AND application_name != 'hologres'
Ubah timeout kueri aktif
Anda dapat mengubah timeout eksekusi untuk kueri aktif.
Sintaks
SET statement_timeout = <time>;Deskripsi parameter
time: Menentukan periode timeout. Nilainya berkisar antara 0 hingga 2147483647. Satuan default adalah milidetik (ms). Jika Anda menentukan satuan berbeda, sertakan nilai dan satuannya dalam tanda kutip tunggal. Timeout default adalah 10 jam. Pengaturan ini bersifat tingkat sesi.CatatanAgar timeout diterapkan, pernyataan
SET statement_timeout = <time>harus dieksekusi dalam batch yang sama dengan pernyataan SQL target.Contoh penggunaan
Atur timeout menjadi 5.000 menit. Karena satuan ditentukan, seluruh nilai '5000min' harus diapit tanda kutip tunggal.
SET statement_timeout = '5000min' ; SELECT * FROM tablename;Atur timeout menjadi 5.000 ms.
SET statement_timeout = 5000 ; SELECT * FROM tablename;
Ubah timeout kueri idle
Parameter idle_in_transaction_session_timeout menentukan perilaku timeout untuk transaksi yang memasuki keadaan idle. Jika parameter ini tidak diatur, transaksi idle tidak akan timeout secara default, yang dapat menyebabkan transaksi tidak dilepas dan memicu deadlock. Anda dapat mengubah timeout untuk kueri idle.
Kasus penggunaan
Atur timeout ini untuk mencegah kueri menyebabkan deadlock. Misalnya, kode berikut memulai transaksi tetapi tidak melakukan commit karena pernyataan
COMMITtidak ada. Hal ini menyebabkan kebocoran transaksi, yang dapat memicu deadlock tingkat database yang memengaruhi ketersediaan layanan.BEGIN; SELECT * FROM t;Saat skenario deadlock ini terjadi, Anda dapat mengatasinya dengan mengatur parameter idle_in_transaction_session_timeout. Ketika koneksi idle dengan transaksi terbuka tidak di-commit atau di-rollback dalam waktu yang ditentukan oleh idle_in_transaction_session_timeout, sistem secara otomatis akan rollback transaksi dan menutup koneksi.
Sintaks
-- Ubah timeout transaksi idle pada tingkat sesi. SET idle_in_transaction_session_timeout=<time>; -- Ubah timeout transaksi idle pada tingkat database. ALTER database db_name SET idle_in_transaction_session_timeout=<time>;Deskripsi parameter
time: Menentukan periode timeout. Nilainya berkisar antara 0 hingga 2147483647. Satuan default adalah milidetik (ms). Jika Anda menentukan satuan berbeda, sertakan nilai dan satuannya dalam tanda kutip tunggal. Di Hologres V0.10 dan versi lebih lama, nilai default adalah 0, yang berarti transaksi idle tidak dihentikan secara otomatis. Di Hologres V1.1 dan versi lebih baru, nilai default adalah 10 menit. Transaksi yang idle lebih dari 10 menit akan di-rollback.CatatanJangan atur timeout terlalu singkat. Timeout yang terlalu pendek dapat menyebabkan sistem salah melakukan rollback terhadap transaksi yang masih digunakan.
Contoh penggunaan
Atur timeout menjadi 300.000 ms.
-- Ubah timeout transaksi idle pada tingkat sesi. SET idle_in_transaction_session_timeout=300000; -- Ubah timeout transaksi idle pada tingkat database. ALTER database db_name SET idle_in_transaction_session_timeout=300000;
Kueri log kueri lambat
Mulai dari Hologres V0.10, Anda dapat mengkueri log kueri lambat. Untuk informasi lebih lanjut, lihat Lihat dan analisis log kueri lambat.
FAQ
Gejala
Eksekusi pernyataan SQL mengembalikan error berikut:
ERROR: canceling statement due to statement timeout.Penyebab dan solusi
Penyebab 1: Timeout diatur di client atau instans Hologres. Pengaturan timeout umum meliputi:
API yang dihasilkan oleh Data Service memiliki timeout tetap
10syang tidak dapat diubah. Kami menyarankan Anda mengoptimalkan pernyataan SQL untuk mengurangi waktu eksekusi.Timeout untuk kueri yang dieksekusi dari modul SQL Hologres di HoloWeb atau DataWorks adalah
1h. Nilai ini tidak dapat diubah. Kami menyarankan Anda mengoptimalkan SQL untuk mengurangi waktu eksekusi.Timeout diatur untuk instans Hologres. Anda dapat menjalankan pernyataan SQL berikut untuk melihat timeout yang diatur untuk instans. Jika error disebabkan oleh timeout instans, Anda dapat mengatur ulang timeout sesuai kebutuhan bisnis.
SHOW statement_timeout;Timeout diatur di client atau aplikasi. Anda perlu memeriksa pengaturan client. Jika error disebabkan oleh timeout client, Anda dapat mengatur ulang timeout sesuai kebutuhan bisnis.
Penyebab 2: Timeout terjadi karena operasi
DROPatauTRUNCATEdilakukan pada tabel saat pernyataan DML sedang dieksekusi.Operasi
TRUNCATEsetara dengan menghapus lalu membuat ulang tabel (drop+create). Saat pernyataan DML dieksekusi, ia memperoleh kunci baris atau kunci tabel. Untuk informasi lebih lanjut tentang lock, lihat Locks and lock troubleshooting. Jika operasiDROPatauTRUNCATEdilakukan pada tabel yang sama secara bersamaan, operasi tersebut bersaing untuk lock yang dipegang oleh pernyataan DML. Sistem kemudian membatalkan pernyataan DML, yang memicu errorstatement timeout.Solusi: Periksa log kueri lambat untuk melihat apakah operasi
DROPatauTRUNCATEdilakukan pada tabel secara bersamaan. Hindari operasi semacam itu. Contoh berikut menunjukkan cara melakukan pemeriksaan ini.-- Contoh: Kueri log untuk operasi drop/truncate pada tabel tertentu dalam satu hari terakhir. SELECT * FROM hologres.hg_query_log WHERE command_tag IN ('DROP TABLE','TRUNCATE TABLE') AND query LIKE '%xxx%' AND query_start >= now() - interval '1 day';