全部产品
Search
文档中心

Hologres:ANALYZE dan AUTO ANALYZE

更新时间:Feb 12, 2026

Topik ini menjelaskan cara menggunakan perintah ANALYZE dan mekanisme AUTO ANALYZE yang lebih sederhana.

ANALYZE

Statistik sangat penting bagi pengoptimal untuk menghasilkan rencana eksekusi yang akurat. Hologres mengumpulkan statistik sampel tentang data Anda, seperti distribusi data dan karakteristiknya, statistik tabel, statistik kolom, jumlah baris, jumlah kolom, lebar bidang, kardinalitas, frekuensi, nilai maksimum, nilai minimum, nilai paling sering muncul, serta karakteristik distribusi bucket. Pengoptimal menggunakan informasi ini untuk memperbarui estimasi biaya operator, memangkas ruang pencarian, memperkirakan urutan JOIN optimal, memperkirakan overhead memori, dan memperkirakan tingkat paralelisme—yang pada akhirnya menghasilkan rencana eksekusi yang lebih baik.

Perintah ANALYZE mengumpulkan statistik tentang isi tabel dalam database Anda. Pengoptimal menggunakan statistik ini untuk menghasilkan rencana kueri terbaik dan meningkatkan efisiensi kueri.

  • Sintaks

    -- Perbarui statistik untuk tabel tertentu. Secara default, statistik untuk semua kolom dalam tabel dikumpulkan.
    ANALYZE <tablename>;
    
    -- Perbarui statistik untuk kolom tertentu. Ini melakukan sampling lebih banyak data dibandingkan memperbarui seluruh tabel dan memberikan akurasi yang lebih tinggi. Gunakan ini terutama untuk kolom yang digunakan dalam kondisi filter.
    ANALYZE <tablename>(<colname>, <colname>);
  • Deskripsi parameter

    tablename adalah nama tabel yang statistiknya ingin Anda perbarui. colname adalah nama kolom yang statistiknya ingin Anda perbarui.

  • Rincian sintaks

    Berikut penjelasan mengenai dua bentuk perintah ANALYZE tersebut.

    • Kesamaan

      • Statistik kolom menyediakan informasi tentang jumlah baris, lebar kolom, nilai paling umum (MCV), histogram, dan jumlah nilai unik (NDV).

      • Kedua perintah hanya menimpa statistik untuk kolom yang ditentukan dan tidak mengubah kolom lainnya. Misalnya, perintah ANALYZE <tablename>(<colname1>); menimpa (memperbarui) statistik yang sebelumnya dikumpulkan untuk colname1, tetapi tidak memengaruhi statistik untuk colname2.

    • Perbedaan

      • ANALYZE <tablename>; menghitung statistik berdasarkan data sampel.

      • ANALYZE <tablename>(<colname>, <colname>); menghitung NDV menggunakan APPROX_COUNT_DISTINCT. Dalam banyak kasus, ini menghasilkan hasil yang lebih akurat daripada sampling, tetapi memiliki overhead yang lebih tinggi. Oleh karena itu, gunakan bentuk ini hanya untuk kolom-kolom kritis. Statistik seperti histogram dan lebar tetap berasal dari sampling.

      Untuk tabel dengan dua kolom, table (colname1, colname2), ANALYZE table; tidak sepenuhnya setara dengan ANALYZE table(colname1, colname2);.

      Untuk kolom JOIN atau GROUP BY yang sering digunakan, gunakan ANALYZE <tablename>(<colname>, <colname>); untuk mengumpulkan statistik tambahan.

  • Kapan menjalankan ANALYZE

    Jalankan ANALYZE <tablename>; dalam situasi berikut.

    • Setelah melakukan sejumlah besar operasi INSERT, UPDATE, atau DELETE pada tabel, seperti impor data.

    • Sebelum menjalankan kueri JOIN multi-tabel saat performa menurun. Jalankan ANALYZE pada kolom JOIN dan kolom GROUP BY.

    • Setelah menjalankan CREATE FOREIGN TABLE, kumpulkan statistik untuk tabel eksternal tersebut menggunakan ANALYZE.

    • Setelah menjalankan IMPORT FOREIGN SCHEMA, jalankan ANALYZE pada tabel yang akan Anda kueri.

    • Setelah menjalankan CREATE EXTERNAL DATABASE, kumpulkan statistik untuk tabel eksternal tersebut menggunakan ANALYZE.

  • Catatan

    • Pada Hologres V0.10 dan V1.1, jika Anda mengkueri tabel partisi induk, jalankan ANALYZE pada tabel induk tersebut. Jika Anda mengkueri tabel anak secara langsung, jalankan ANALYZE pada tabel anak tersebut. Jika Anda melakukan keduanya, jalankan ANALYZE pada keduanya agar tidak kehilangan statistik.

    • Jika Anda mengalami masalah berikut, jalankan ANALYZE sebelum memulai tugas impor Anda untuk meningkatkan efisiensi secara sistematis.

      • JOIN multi-tabel melebihi batas memori (OOM): Biasanya menghasilkan error seperti Query executor exceeded total memory limitation xxxxx: yyyy bytes used.

      • Efisiensi impor rendah: Kueri atau impor data di Hologres berjalan lambat, dan tugas membutuhkan waktu lama untuk diselesaikan.

    • Jika tabel Anda berisi kolom yang sangat lebar (seperti data Bitmap atau Bytea lainnya, atau data Text yang melebihi 1 KB), statistik untuk kolom tersebut tidak memberikan manfaat dan justru meningkatkan konsumsi memori selama proses sampling. Untuk tabel semacam ini, hindari menjalankan ANALYZE <tablename>;. Sebagai gantinya, gunakan ANALYZE <tablename>(<colname>, <colname>); untuk melewati kolom lebar dan hanya menganalisis kolom yang diperlukan (seperti kolom JOIN, kolom GROUP BY, dan kolom filter).

      Catatan

      1 KB adalah ambang batas empiris. Anda dapat menyesuaikannya berdasarkan kebutuhan bisnis Anda.

AUTO ANALYZE

Untuk mengurangi operasi ANALYZE manual yang berulang, Hologres V0.10 dan versi selanjutnya mendukung AUTO ANALYZE. Saat diaktifkan, sistem secara otomatis menentukan apakah perlu menjalankan ANALYZE pada tabel terkait di latar belakang berdasarkan pembuatan tabel, penulisan data, dan modifikasi. Hal ini menghilangkan kebutuhan untuk ANALYZE manual, mengurangi kompleksitas operasional, dan mencegah hilangnya statistik akibat kelalaian.

  • Sintaks

    • Periksa apakah AUTO ANALYZE diaktifkan

      SHOW hg_enable_start_auto_analyze_worker;  -- Sintaks untuk V1.1 dan versi selanjutnya untuk memeriksa status saat ini
      
      SHOW hg_experimental_enable_start_auto_analyze_worker;  -- Sintaks untuk V0.10 untuk memeriksa status saat ini
    • Sintaks untuk mengaktifkan atau menonaktifkan sebagai berikut. Perintah ini memerlukan hak istimewa Superuser.

      -- Pengaturan tingkat database. Berlaku untuk seluruh database. Sintaks untuk V1.1 dan versi selanjutnya.
      ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = ON;  -- Aktifkan (default)
      ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = OFF; -- Nonaktifkan
      
      -- Pengaturan tingkat database. Berlaku untuk seluruh database. Sintaks untuk V0.10.
      ALTER DATABASE dbname SET hg_experimental_enable_start_auto_analyze_worker = ON;  -- Aktifkan (default)
      ALTER DATABASE dbname SET hg_experimental_enable_start_auto_analyze_worker = OFF; -- Nonaktifkan
      
      -- Aktifkan AUTO ANALYZE untuk External Database
      ALTER EXTERNAL DATABASE dbname WITH enable_auto_analyze 'true';
  • Batasan

    AUTO ANALYZE di Hologres memiliki batasan berikut:

    • AUTO ANALYZE hanya didukung di Hologres V0.10 dan versi selanjutnya. Anda dapat memeriksa versi instans Anda di halaman detail instans di Hologres Management Console. Jika instans Anda menjalankan versi sebelum V0.10, untuk informasi lebih lanjut, lihat Common upgrade preparation failure errors atau bergabunglah dengan grup DingTalk Hologres untuk mendapatkan dukungan. Untuk informasi lebih lanjut, lihat How do I get more online support?.

    • Hanya Superuser yang dapat mengaktifkan atau menonaktifkan AUTO ANALYZE.

    • Batasan untuk tabel partisi:

      • Ketika tabel anak partisi berubah dan memerlukan AUTO ANALYZE, sistem menganalisis tabel induk.

      • Tabel partisi memiliki batas pemindaian baris. Secara default, sampling memindai hingga 224 baris (16.777.216 baris). Jika jumlah total baris di semua partisi melebihi batas ini, sistem melakukan Pemangkasan partisi dan hanya melakukan sampling pada subset partisi (total tidak lebih dari 16.777.216 baris).

        Catatan

        Statistik kolom kunci partisi selalu lengkap dan tidak terpengaruh oleh pemangkasan. Namun, hal ini dapat memengaruhi statistik untuk kolom yang berlokasi bersama kunci partisi (seperti kolom dengan data identik). Dalam kasus tersebut, beberapa nilai mungkin terlewat, sehingga menyebabkan estimasi jumlah baris menjadi tidak akurat. Jika diperlukan, Anda dapat mencari grup DingTalk 32314975 untuk bergabung dengan grup diskusi gudang data real-time Hologres dan menghubungi dukungan teknis. Insinyur dapat mengevaluasi instans Anda dan menyesuaikan batas maksimum jumlah baris yang dipindai.

    • AUTO ANALYZE mengumpulkan statistik untuk maksimal 256 kolom secara default. Untuk tabel dengan lebih dari 256 kolom, sistem memproses 256 kolom pertama. Anda dapat mengubah batas ini dengan menyesuaikan hg_experimental_auto_analyze_max_columns_count.

    • AUTO ANALYZE membatasi penggunaan memori per worker hingga 4 GB secara default. Tabel dengan kolom yang sangat lebar mungkin melebihi batas ini dan menyebabkan ANALYZE gagal. Anda dapat menyesuaikan parameter auto_analyze_work_memory_mb untuk meningkatkan batas ini, tetapi pertimbangkan dampaknya terhadap memori sistem. Tipe instans yang lebih besar mendukung lebih banyak worker dan batas memori total yang lebih tinggi untuk AUTO ANALYZE.

    • Mulai Hologres V3.1.0, ANALYZE dan AUTO ANALYZE mendukung pengumpulan statistik untuk tabel eksternal di External Database.

    • ANALYZE dan AUTO ANALYZE tidak mendukung tabel eksternal HMS.

  • Cara kerja AUTO ANALYZE

    Setelah mengaktifkan AUTO ANALYZE, sistem secara berkala memeriksa di latar belakang tabel-tabel yang memerlukan ANALYZE.

    • Tabel standar (tabel internal, termasuk tabel non-partisi dan partisi)

      • Setiap menit, sistem memeriksa aktivitas tabel terbaru (terutama operasi DML seperti INSERT, UPDATE, atau DELETE yang dapat mengubah volume data). Jika salah satu kondisi berikut terpenuhi, sistem memicu ANALYZE untuk mengumpulkan statistik:

        • Operasi DML selesai dan mengubah lebih dari 10% dari jumlah baris saat ini pada tabel. Untuk tabel anak partisi, artinya perubahan melebihi 10% dari jumlah baris partisi tersebut.

        • TRUNCATE TABLE mengosongkan tabel.

        • Terjadi perubahan DDL, seperti CREATE TABLE atau ALTER TABLE yang memodifikasi skema tabel. Ini tidak termasuk CALL SET_TABLE_PROPERTY untuk mengubah properti tabel.

      • Setiap 10 menit, sistem memeriksa semua tabel internal untuk perubahan data. Jika jumlah baris tabel berubah lebih dari 10% sejak pemeriksaan terakhir, sistem memicu ANALYZE.

        Catatan

        Langkah ini mendeteksi data yang diperbarui oleh operasi DML non-eksplisit (seperti penulisan real-time melalui Flink, integrasi data, atau HoloClient).

    • Tabel Eksternal

      Setiap 4 jam, sistem melakukan inspeksi terjadwal terhadap metadata atau perubahan data tabel eksternal. Jika kondisi berikut terpenuhi, sistem memicu ANALYZE pada tabel tersebut di latar belakang untuk mengumpulkan informasi statistik.

      Tabel eksternal yang sesuai—misalnya, tabel eksternal MaxCompute dan tabel eksternal DLF—telah mengalami perubahan antara dua pemeriksaan (misalnya, dalam rentang waktu 4 jam). Perubahan ini ditentukan berdasarkan apakah last_modify_time dari tabel MaxCompute terkait berada dalam selang waktu pemeriksaan tersebut.

    Catatan

    Inspeksi dan eksekusi terjadi dalam tugas penjadwalan yang sama. Inspeksi berikutnya baru dimulai setelah ANALYZE saat ini selesai. Selama waktu sejak awal inspeksi terakhir memenuhi siklus penjadwalan, inspeksi berikutnya akan dimulai.

  • Parameter konfigurasi

    Setelah mengaktifkan AUTO ANALYZE, sistem secara otomatis memeriksa tabel secara berkala, menentukan tabel mana yang memerlukan ANALYZE, dan melakukan sampling untuk mengumpulkan statistik. Hal ini mengonsumsi sumber daya sistem.

    Dalam beberapa skenario bisnis, perilaku default mungkin tidak sesuai dengan kebutuhan Anda. Misalnya, dalam skenario dengan pembaruan data yang jarang, Anda dapat mengurangi frekuensi AUTO ANALYZE dengan menyesuaikan parameter default. Anda dapat memodifikasi parameter ini sesuai kebutuhan untuk tuning performa.

    Catatan

    Hanya Superuser yang dapat menyesuaikan perilaku AUTO ANALYZE. Semua pengaturan berlaku pada tingkat database dan berlaku dalam waktu satu menit.

    • Sintaks

      -- Sintaks Superuser untuk memodifikasi nilai default parameter AUTO ANALYZE
      ALTER DATABASE <dbname> SET <GUC>=<values>;

      dbname adalah nama database. GUC adalah nama parameter. values adalah nilai parameter.

    • Daftar parameter

      Parameter

      Deskripsi Parameter

      Versi yang Didukung

      Nilai Default

      Contoh

      autovacuum_naptime

      Interval (dalam detik) antara pemeriksaan aktivitas tabel terbaru.

      V1.1.0 dan versi selanjutnya

      Catatan

      Memerlukan penyesuaian backend. Untuk meminta perubahan, cari grup DingTalk 32314975 untuk bergabung dengan grup diskusi gudang data real-time Hologres.

      60s

      • ALTER DATABASE <dbname> SET autovacuum_naptime = 60;

      • ALTER DATABASE <dbname> SET autovacuum_naptime = '60s';

      • ALTER DATABASE <dbname> SET autovacuum_naptime = '10min';

      hg_auto_check_table_changes_interval

      Interval (dalam detik) untuk memeriksa perubahan data di semua tabel internal.

      V1.1.0 dan versi selanjutnya

      600s (10menit)

      -- Sintaks untuk V1.1 dan versi selanjutnya
      ALTER DATABASE <dbname> SET hg_auto_check_table_changes_interval = '600s';
      -- Sintaks untuk V0.10
      ALTER DATABASE <dbname> SET hg_experimental_auto_check_table_changes_interval = '600s';

      hg_auto_check_foreign_table_changes_interval

      Interval (dalam detik) untuk memeriksa perubahan data di semua tabel eksternal.

      V1.1.0 dan versi selanjutnya

      14400s (4 jam)

      -- Sintaks untuk V1.1 dan versi selanjutnya
      ALTER DATABASE <dbname> SET hg_auto_check_foreign_table_changes_interval = '14400s';
      -- Sintaks untuk V0.10
      ALTER DATABASE <dbname> SET hg_experimental_auto_check_foreign_table_changes_interval = '14400s';

      hg_experimental_auto_analyze_max_columns_count

      Jumlah maksimum kolom yang statistiknya dikumpulkan secara otomatis.

      V1.1.0 dan versi selanjutnya

      256

      ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_max_columns_count = 300;

      auto_analyze_work_memory_mb

      Batas memori (dalam MB) per tabel untuk AUTO ANALYZE.

      V1.1.54 dan versi selanjutnya

      Default: 4096 MB (4 GB) per worker. Tipe instans yang lebih besar mendukung lebih banyak worker dan batas memori total yang lebih tinggi.

      Tetapkan batas memori per tabel menjadi 9 GB.

      ALTER DATABASE <dbname> SET auto_analyze_work_memory_mb = 9216;

      hg_experimental_auto_analyze_start_time

      Waktu mulai harian untuk AUTO ANALYZE.

      Catatan

      Harus menggunakan zona waktu yang sama dengan end_time, dan start time harus kurang dari atau sama dengan end_time.

      V1.1.54 dan versi selanjutnya

      00:00 +0800

      Konfigurasikan AUTO ANALYZE agar hanya berjalan antara pukul 00:00 dan 06:00 jika data tabel internal dan eksternal tidak berubah sepanjang hari.

      • ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_start_time = '00:00 +0800';
      • ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_end_time = '06:00 +0800';

      hg_experimental_auto_analyze_end_time

      Waktu akhir harian untuk AUTO ANALYZE.

      V1.1.54 dan versi selanjutnya

      23:59 +0800

      autovacuum_enabled

      Status pengaktifan AUTO ANALYZE pada tabel.

      V1.1.54 dan versi selanjutnya

      true (diaktifkan secara default untuk semua tabel).

      Nonaktifkan AUTO ANALYZE untuk tabel tertentu. Operasi ANALYZE di masa depan akan melewati tabel ini.

      Catatan

      Anda hanya dapat menonaktifkan Auto Analyze untuk tabel internal Hologres menggunakan perintah berikut.

      ALTER TABLE <tablename> SET (autovacuum_enabled = false);

Optimasi tambahan

Mulai Hologres V3.1, fitur Fast Rows tersedia. Ketika Hologres mendeteksi bahwa tabel dalam kueri tidak memiliki statistik, sistem langsung mengambil jumlah baris tabel dari mesin penyimpanan. Operasi ini membutuhkan waktu sekitar 10 ms. Gunakan perintah berikut.

-- Pengaturan tingkat database. Berlaku untuk seluruh database.
ALTER DATABASE dbname SET hg_experimental_get_fast_num_of_rows = ON;  -- Aktifkan (dinonaktifkan secara default)

-- Pengaturan tingkat database. Berlaku untuk seluruh database.
ALTER DATABASE dbname SET hg_experimental_get_fast_num_of_rows = OFF;  -- Nonaktifkan (dinonaktifkan secara default)
  • Ketika Fast Rows dinonaktifkan, skenario berikut membantu mengurangi kemungkinan rencana yang salah:

    • Jika tabel tidak memiliki statistik, jumlah barisnya muncul sebagai 1000 dalam rencana kueri (menunjukkan statistik hilang, dengan rencana diestimasi berdasarkan 1000 baris).

    image

  • Ketika Fast Rows diaktifkan dan tabel tidak memiliki statistik, jumlah baris dalam rencana kueri bukan 1000 (sistem memanggil mesin penyimpanan untuk mengambil jumlah baris aktual).

    image

Kueri statistik

Statistik tabel disimpan dalam tabel hologres_statistic.hg_table_statistic. Anda dapat memeriksa tabel ini untuk memantau status ANALYZE. Gunakan perintah berikut.

Catatan

Untuk menemukan informasi ANALYZE terbaru, urutkan berdasarkan analyze_timestamp.

SELECT schema_name,                -- Skema tabel
       table_name,                 -- Nama tabel
       schema_version,             -- Versi skema tabel
       statistic_version,          -- Versi statistik ANALYZE terbaru
       total_rows,                 -- Jumlah baris dari ANALYZE terbaru
       analyze_timestamp           -- Waktu selesai ANALYZE terbaru
FROM   hologres_statistic.hg_table_statistic
WHERE  table_name = '<tablename>'
ORDER BY analyze_timestamp DESC;
  • Setiap tabel memiliki 0–n catatan dalam hologres_statistic.hg_table_statistic. Nol catatan berarti ANALYZE belum pernah dijalankan. Satu atau lebih catatan berarti ANALYZE telah dijalankan.

  • Jika terdapat beberapa catatan, nilai schema_version-nya berbeda karena skema tabel berubah (misalnya ketika menjalankan ADD COLUMN membuat versi baru). Catatan lama dengan schema_version yang kedaluwarsa tidak lagi digunakan.

  • Contoh hasil kueri yang menampilkan dua catatan untuk tabel yang sama. Catatan kedua memiliki schema_version yang lebih rendah dan sudah usang. Anda dapat mengabaikannya.

     schema_name |    table_name    | schema_version | statistic_version | total_rows |  analyze_timestamp
    -------------+------------------+----------------+-------------------+------------+---------------------
     public      | tbl_name_example |             13 |              8580 |      10002 | 2022-04-29 16:03:18
     public      | tbl_name_example |             10 |              8576 |      10002 | 2022-04-29 15:41:20
    (2 rows)
  • Hologres V0.10 dan V1.1 tidak membersihkan catatan historis yang kedaluwarsa dalam hg_table_statistic. Anda dapat mengabaikan data lama tersebut dengan aman.

Lihat tabel yang kekurangan statistik

Anda dapat menggunakan tampilan HG_STATS_MISSING untuk mengidentifikasi tabel dalam database Anda yang kekurangan statistik. Untuk informasi lebih lanjut, lihat HG_STATS_MISSING View.

FAQ

Jika situasi berikut terjadi, AUTO ANALYZE tidak berfungsi dengan baik. Anda dapat mengikuti solusi yang disediakan.

  • Statistik tabel menunjukkan nol catatan

    • Masalah: Mengkueri hologres_statistic.hg_table_statistic tidak mengembalikan data untuk tabel tersebut.

    • Kemungkinan penyebab:

      • AUTO ANALYZE tidak berjalan, atau tabel tidak memenuhi kondisi pemicu AUTO ANALYZE.

      • Masalah mungkin terletak pada fitur AUTO ANALYZE itu sendiri. Untuk troubleshooting lebih lanjut, Anda dapat atau mengirimkan tiket.

    • Solusi: Anda dapat memicu ANALYZE secara manual sekali.

  • analyze_timestamp terlalu kecil.

    • Masalah: analyze_timestamp dalam hasil kueri jauh lebih lama dari waktu saat ini, menunjukkan ANALYZE belum dijalankan dalam waktu lama.

    • Kemungkinan penyebab:

      • AUTO ANALYZE gagal dijalankan karena suatu alasan.

      • AUTO ANALYZE dinonaktifkan secara manual.

    • Solusi: Pertama, picu ANALYZE secara manual. Kemudian, , atau kirimkan tiket untuk menyelidiki penyebabnya.