All Products
Search
Document Center

Hologres:Kelola kueri

Last Updated:Feb 04, 2026

Topik ini menjelaskan cara mendiagnosis dan mengelola kueri dalam suatu instans.

Ikhtisar

Hologres kompatibel dengan PostgreSQL. Anda dapat melihat informasi waktu proses kueri dalam suatu instans menggunakan tampilan HG_STAT_ACTIVITY (PG_STAT_ACTIVITY) untuk menganalisis dan mendiagnosis pernyataan SQL yang sedang berjalan. Operasi tersebut mencakup hal-hal berikut:

Lihat kueri aktif menggunakan SQL

Jika Anda lebih suka mengkueri kueri aktif menggunakan SQL, jalankan pernyataan SQL berikut:

  1. Lihat kueri aktif saat ini beserta tahap eksekusi dan konsumsi sumber dayanya:

    Catatan

    Superuser dapat melihat informasi waktu proses SQL semua pengguna. Pengguna non-superuser hanya dapat melihat informasi waktu proses SQL miliknya sendiri.

    -- Sintaks 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'
    
    -- Sintaks untuk Hologres V1.3 dan versi sebelumnya
    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:

    -- Sintaks 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:

    -- Sintaks 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 jangka panjang dalam instans saat ini:

    -- Sintaks 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;
    
    -- Sintaks untuk Hologres V1.3 dan versi sebelumnya
    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;

    Pernyataan update telah berjalan selama 24 detik dan belum selesai.

Kelola kueri aktif di Konsol HoloWeb

Anda dapat melihat dan mengelola kueri aktif di Konsol HoloWeb.

  1. Masuk 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, 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 kueri berisi informasi berikut:

    Parameter

    Deskripsi

    Query Start

    Waktu saat kueri dimulai.

    Runtime

    Waktu eksekusi kueri.

    PID

    ID proses layanan kueri.

    Query

    Pernyataan SQL yang dijalankan.

    State

    Status koneksi saat ini. Status umum meliputi:

    • active: Koneksi aktif.

    • idle: Idle.

    • idle in transaction: Koneksi idle dalam transaksi jangka panjang.

    • idle in transaction (Aborted): Koneksi idle dalam transaksi yang gagal.

    • \N: Status kosong. Ini menunjukkan proses yang bukan koneksi pengguna. Biasanya merupakan proses maintenance latar belakang sistem dan dapat diabaikan.

    User Name

    Username koneksi saat ini.

    Application

    Jenis aplikasi kueri.

    Client Address

    Alamat IP klien yang memulai kueri.

    Jika suatu kueri berjalan lama, klik Cancel di kolom Actions kueri tersebut untuk menghentikannya. Anda juga dapat memilih beberapa kueri sekaligus dan mengklik Batch Cancel.

  5. (Opsional) Klik Details di kolom Actions kueri target untuk melihat detailnya.

    Di halaman Details, Anda dapat melakukan operasi berikut:

    • Copy: Salin pernyataan SQL yang dijalankan.

    • Format: Format pernyataan SQL yang dijalankan.

Troubleshooting kunci

Anda dapat menggunakan kueri aktif untuk memeriksa apakah pernyataan SQL saat ini memegang kunci atau diblokir oleh kunci tersebut. Untuk informasi selengkapnya, lihat Kunci dan troubleshooting kunci.

Hentikan kueri

Untuk menghentikan kueri yang tidak sesuai harapan, jalankan perintah berikut.

  • Hentikan satu kueri:

    SELECT pg_cancel_backend(<pid>);
  • Hentikan 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 periode timeout untuk kueri aktif

Hologres memungkinkan Anda mengubah periode timeout untuk kueri aktif dengan cara berikut.

  • Contoh sintaks

    SET statement_timeout = <time>;
  • Deskripsi parameter

    time: Periode timeout. Nilainya berkisar antara 0 hingga 2147483647. Satuan default adalah milidetik (ms). Jika Anda menentukan satuan untuk nilai waktu, Anda harus membungkus nilainya dalam tanda kutip tunggal. Jika tidak, akan terjadi error. Periode timeout default adalah 8 jam. Pengaturan ini berlaku pada tingkat sesi.

    Catatan

    Pernyataan `SET statement_timeout = <time>` harus dijalankan bersamaan dengan pernyataan SQL yang ingin Anda ubah periode timeout-nya.

  • Contoh

    • Atur periode timeout menjadi 5000 menit. Nilai `5000min` menyertakan satuan dan harus dibungkus dalam tanda kutip tunggal.

      SET statement_timeout = '5000min' ; 
      SELECT * FROM tablename;
    • Atur periode timeout menjadi 5000 ms.

      SET statement_timeout = 5000 ; 
      SELECT * FROM tablename;

Ubah periode timeout untuk kueri idle

Parameter idle_in_transaction_session_timeout menentukan perilaku timeout untuk transaksi setelah memasuki status idle. Jika Anda tidak mengatur parameter ini, transaksi tidak akan dilepas saat timeout secara default. Hal ini dapat menyebabkan transaksi tetap terbuka, yang berujung pada deadlock dalam kueri. Hologres memungkinkan Anda mengubah periode timeout untuk kueri idle dengan cara berikut.

  • Skenario

    Atur periode timeout ketika eksekusi kueri menyebabkan deadlock. Misalnya, dalam kode berikut, transaksi dimulai tetapi tidak dikomit karena pernyataan commit tidak dijalankan. Hal ini menyebabkan kebocoran transaksi, yang dapat mengakibatkan deadlock tingkat database dan memengaruhi penggunaan layanan secara normal.

    BEGIN; 
    SELECT * FROM t;

    Saat skenario deadlock ini terjadi, Anda dapat mengatasinya dengan mengatur parameter idle_in_transaction_session_timeout. Jika koneksi idle dengan transaksi tidak dikomit atau di-rollback dalam waktu yang ditentukan oleh idle_in_transaction_session_timeout, sistem akan secara otomatis melakukan rollback transaksi dan menutup koneksi.

  • Contoh sintaks

    -- Ubah periode timeout transaksi idle pada tingkat sesi
    SET idle_in_transaction_session_timeout=<time>;
    
    -- Ubah periode timeout transaksi idle pada tingkat database
    ALTER database db_name SET idle_in_transaction_session_timeout=<time>;
  • Deskripsi parameter

    time: Periode timeout. Nilainya berkisar antara 0 hingga 2147483647. Satuan default adalah milidetik (ms). Jika Anda menentukan satuan untuk nilai waktu, Anda harus membungkus nilainya dalam tanda kutip tunggal. Jika tidak, akan terjadi error. Di Hologres V0.10 dan versi sebelumnya, nilai default adalah 0, yang berarti transaksi idle tidak dihapus secara otomatis. Di Hologres V1.1, nilai default adalah 10 menit. Setelah 10 menit, transaksi akan di-rollback.

    Catatan

    Jangan mengatur periode timeout ke nilai kecil. Periode timeout yang singkat dapat menyebabkan transaksi yang sedang digunakan di-rollback secara tidak sengaja.

  • Contoh

    Atur periode timeout menjadi 300000 ms.

    -- Ubah periode timeout transaksi idle pada tingkat sesi
    SET idle_in_transaction_session_timeout=300000;
    
    -- Ubah periode 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 selengkapnya, lihat Lihat dan analisis log kueri lambat.

FAQ

  • Gejala

    Error berikut dilaporkan setelah Anda menjalankan pernyataan SQL: ERROR: canceling statement due to statement timeout.

  • Penyebab dan solusi

    • Penyebab 1: Periode timeout diatur untuk klien atau instans Hologres. Pengaturan timeout umum meliputi:

      • API dihasilkan menggunakan DataService Studio. Periode timeout untuk DataService Studio adalah 10 s dan tidak dapat diubah. Optimalkan pernyataan SQL untuk mengurangi waktu eksekusinya.

      • Kueri dijalankan di Konsol HoloWeb atau modul SQL Hologres di DataWorks. Periode timeout adalah 1 h dan tidak dapat diubah. Optimalkan pernyataan SQL untuk mengurangi waktu eksekusinya.

      • Periode timeout diatur untuk instans Hologres. Anda dapat menjalankan pernyataan SQL berikut untuk melihat periode timeout yang diatur untuk instans tersebut. Jika error disebabkan oleh periode timeout instans, atur ulang ke nilai yang wajar sesuai kebutuhan.

        SHOW statement_timeout;
      • Periode timeout diatur untuk klien atau aplikasi. Periksa pengaturan klien. Jika error disebabkan oleh periode timeout klien, atur ulang ke nilai yang wajar sesuai kebutuhan.

    • Penyebab 2: Operasi `DROP` atau `TRUNCATE` dilakukan pada tabel saat pernyataan SQL Data Manipulation Language (DML) sedang dijalankan pada tabel yang sama, yang menyebabkan timeout.

      Operasi `TRUNCATE` bekerja dengan menjalankan drop+create, yang pertama kali menghapus tabel lalu membuatnya kembali. Saat pernyataan DML dijalankan, pernyataan tersebut memperoleh kunci baris atau kunci tabel. Untuk informasi selengkapnya tentang kunci, lihat Kunci dan troubleshooting kunci. Jika Anda menjalankan operasi `DROP` atau `TRUNCATE` pada tabel yang sama secara bersamaan, operasi tersebut bersaing untuk mendapatkan kunci yang dipegang oleh pernyataan DML. Sistem kemudian membatalkan pernyataan DML, dan error statement timeout dilaporkan.

      Solusi: Periksa log kueri lambat untuk melihat apakah operasi drop atau truncate dilakukan pada tabel tersebut secara bersamaan. Hindari operasi semacam itu. Contoh berikut menunjukkan cara mengkueri log tersebut.

      -- Contoh: Kueri catatan drop/truncate untuk 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';