All Products
Search
Document Center

Hologres:Kelola kueri

Last Updated:May 13, 2026

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:

Catatan

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:

  1. Lihat kueri aktif, tahap eksekusinya, dan konsumsi resource.

    Catatan

    Superuser 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 }
  2. 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 | 1008305xxx
  3. Urutkan 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 | 10083259096119559
  4. Lihat 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 UPDATE telah berjalan selama 24 detik tanpa selesai.

Kelola kueri aktif di HoloWeb

Anda dapat melihat dan mengelola kueri aktif di Konsol HoloWeb.

  1. Masuk ke Konsol HoloWeb. Untuk informasi lebih lanjut, lihat Hubungkan ke HoloWeb dan jalankan kueri.

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

  3. Di panel navigasi kiri, pilih Management for Information About Active Queries > Active Query Tasks.

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

  5. (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.

    Catatan

    Agar 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 COMMIT tidak 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.

    Catatan

    Jangan 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 10s yang 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 DROP atau TRUNCATE dilakukan pada tabel saat pernyataan DML sedang dieksekusi.

      Operasi TRUNCATE setara 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 operasi DROP atau TRUNCATE dilakukan pada tabel yang sama secara bersamaan, operasi tersebut bersaing untuk lock yang dipegang oleh pernyataan DML. Sistem kemudian membatalkan pernyataan DML, yang memicu error statement timeout.

      Solusi: Periksa log kueri lambat untuk melihat apakah operasi DROP atau TRUNCATE dilakukan 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';