All Products
Search
Document Center

Hologres:ANALYZE dan AUTO ANALYZE

Last Updated:Jun 26, 2026

Dokumen ini menjelaskan perintah ANALYZE di Hologres dan perilaku AUTO ANALYZE untuk pengumpulan statistik otomatis, termasuk parameter utama yang membantu Anda memahami serta mengontrol pengumpulan statistik guna meningkatkan kualitas rencana kueri.

Ikhtisar statistik dan ANALYZE

Mengapa statistik diperlukan?

Pengoptimal mengandalkan statistik tabel dan kolom untuk menghasilkan rencana eksekusi yang masuk akal, termasuk:

  • Jumlah baris dan jumlah kolom

  • Lebar kolom (Width)

  • Number of Distinct Values (NDV)

  • Most Common Values (MCV) dan frekuensinya

  • Histogram dan karakteristik distribusi lainnya

Informasi ini membimbing pengoptimal untuk:

  • Memperkirakan biaya eksekusi operator

  • Memangkas ruang pencarian rencana eksekusi

  • Memilih urutan Join dan algoritma Join yang sesuai

  • Memperkirakan kebutuhan memori dan paralelisme

Hal ini menghasilkan rencana eksekusi yang lebih optimal.

Perintah ANALYZE adalah metode standar bagi pengguna untuk secara aktif mengumpulkan statistik tabel/kolom. Ketika statistik tidak tersedia atau tidak akurat, rencana kueri dapat menurun secara signifikan—misalnya, urutan Join yang tidak normal—yang terlihat sebagai: OOM pada kueri, waktu eksekusi lama, atau konsumsi CPU instans yang tinggi.

AUTO ANALYZE adalah metode standar bagi sistem Hologres untuk secara otomatis mengumpulkan statistik tabel/kolom. Karena AUTO ANALYZE merupakan perilaku sistem latar belakang asinkron, terdapat penundaan beberapa detik hingga menit antara perubahan data tabel dan saat AUTO ANALYZE mendeteksi, menjadwalkan, serta menyelesaikan pengumpulan statistik otomatis. Oleh karena itu, dalam beberapa skenario tertentu, disarankan agar pengguna menjalankan ANALYZE secara manual untuk memastikan statistik dikumpulkan tepat waktu.

Kapan harus menjalankan ANALYZE secara manual

Eksekusi manual disarankan dalam skenario berikut:

  • Setelah operasi INSERT / UPDATE / DELETE yang mengimpor/memperbarui/menghapus sejumlah besar data pada suatu tabel, dan tabel tersebut akan diakses segera, disarankan untuk menjalankan ANALYZE pada tabel tersebut setelah operasi INSERT / UPDATE / DELETE;

  • Ketika performa Join multi-tabel menurun secara signifikan, jalankan ANALYZE tingkat kolom pada kolom Join utama dan kolom Group By;

  • Setelah menjalankan CREATE FOREIGN TABLE atau IMPORT FOREIGN SCHEMA untuk tabel eksternal, dan tabel tersebut akan diakses segera, disarankan untuk menjalankan ANALYZE pada tabel eksternal yang baru dibuat sebelum melakukan kueri untuk mengumpulkan statistik awal;

  • Setelah menjalankan CREATE EXTERNAL DATABASE, dan database tersebut akan diakses segera, disarankan untuk menjalankan ANALYZE pada tabel-tabel yang perlu diakses di bawah database eksternal tersebut sebelum melakukan kueri;

  • Ketika salah satu dari error/gejala berikut terjadi:

    • Error OOM pada Join multi-tabel: Query executor exceeded total memory limitation ..., atau Query exceed per query memory limitation ...;

    • Error Join multi-tabel: Capacity error: BinaryArray cannot contain more than 2147483646 bytes ...;

    • Tugas impor atau kueri berjalan sangat lama dengan pemanfaatan CPU yang tidak merata.

    • EXPLAIN <SQL> menunjukkan operator Scan dengan perkiraan jumlah baris sebesar 1000, -> Seq Scan on tbl (cost=0.00..5.00 rows=1000 width=1); hal ini menunjukkan bahwa tabel tidak memiliki statistik.

    • EXPLAIN <SQL> menunjukkan operator Scan dengan perkiraan jumlah baris sebesar 1, -> Seq Scan on tbl (cost=0.00..1.00 rows=1 width=1); hal ini menunjukkan bahwa tabel diperkirakan memiliki 0 baris. Jika hasil Scan aktual bukan 0 baris, statistik mungkin sudah usang, dan disarankan untuk menjalankan ANALYZE secara manual.

Pada skenario di atas, umumnya disarankan untuk pertama kali menjalankan ANALYZE secara manual dan mengamati apakah performa pulih, kemudian menyesuaikan konfigurasi AUTO ANALYZE lebih lanjut.

Perintah ANALYZE

Sintaks dasar dan perilaku

  • Mengumpulkan statistik untuk semua kolom seluruh tabel

ANALYZE table_name;
  • Mengumpulkan jumlah baris tabel dan secara seragam mengumpulkan statistik Width, MCV, Histogram, NDV, dan lainnya untuk semua kolom reguler dalam tabel;

  • Menggunakan pendekatan berbasis sampling untuk memperkirakan berbagai nilai statistik. Operasi sampling memulai sub-SQL sampling dalam proses ANALYZE.

  • Secara default, ANALYZE melakukan sampling acak sebanyak 30.000 baris dari tabel untuk pengumpulan dan komputasi statistik. Jika tabel memiliki kurang dari 30.000 baris, semua baris akan disampling.

  • Mengumpulkan statistik hanya untuk kolom tertentu (disarankan untuk kolom kunci)

ANALYZE table_name(col1, col2, ...);
  • Menghitung NDV yang lebih akurat untuk kolom yang ditentukan (biasanya menggunakan logika APPROX_COUNT_DISTINCT), yang lebih akurat daripada sampling tingkat tabel tetapi lebih mahal;

  • Statistik MCV, Histogram, Width, dan lainnya masih diperoleh melalui sampling;

  • Ketika ANALYZE dijalankan beberapa kali pada kolom yang sama, eksekusi terakhir akan menimpa statistik lama untuk kolom tersebut, tetapi tidak memengaruhi kolom lain yang tidak ditentukan.

Untuk tabel dengan banyak kolom, ANALYZE table_name; tidak sepenuhnya setara dengan ANALYZE table_name(col1, col2, ...): yang terakhir biasanya lebih akurat untuk NDV tetapi lebih mahal. Disarankan untuk menjalankan ANALYZE tingkat kolom pada kolom Join yang sering digunakan, kolom Group By, dan kolom kunci lainnya sebagai pelengkap.

Batasan dan pertimbangan

  • Kolom mana yang tidak akan dianalisis

    • Tipe yang tidak didukung: Ketika tipe kolom merupakan User Defined Type atau tidak termasuk dalam himpunan tipe yang didukung Hologres untuk statistik, pengumpulan statistik akan dilewati:

      • Tipe kolom yang tidak mendukung ANALYZE meliputi: "char" (tipe karakter tunggal), BIT, VARBIT, BYTEA, NAME, JSON, TSVECTOR, TSQUERY, OID, XID, CID, INET, POINT, LINE, LSEG, BOX, CIRCLE, PATH, POLYGON, BITARRAY, VARBITARRAY, BYTEAARRAY, INT2ARRAY, MONEYARRAY, NUMERICARRAY, TIMEARRAY, TIMETZARRAY, TIMESTAMPTZARRAY, TIMESTAMPARRAY, ANYARRAY, REGCLASS, DATEARRAY, atau tipe INTERNAL lainnya.

      • Ketika tipe kolom tidak didukung, baik ANALYZE manual maupun AUTO ANALYZE akan diabaikan;

      • Untuk tabel partisi, tipe kolom yang tidak mendukung penggabungan statistik partisi inkremental juga tidak akan dianalisis. Selain tipe yang tercantum di atas, tipe yang tidak didukung juga mencakup: BOOLARRAY, INT4ARRAY, TEXTARRAY, BPCHARARRAY, VARCHARARRAY, INT8ARRAY, FLOAT4ARRAY, FLOAT8ARRAY.

    • Kolom yang ditandai sebagai dropped: Kolom logis yang dipertahankan setelah ALTER TABLE ... DROP COLUMN (attisdropped = true) tidak akan dianalisis;

    • Dinonaktifkan secara eksplisit melalui atribut kolom:

      • Kolom dengan atribut kolom enable_analyze = false tidak akan diproses oleh ANALYZE atau AUTO ANALYZE;

      • Kolom dengan atribut kolom enable_auto_analyze = false tidak akan diproses oleh AUTO ANALYZE.

      • Untuk detail tentang atribut kolom ini, lihat bagian selanjutnya.

    • Statistik kolom JSONB tidak diaktifkan:

      • Jika tipe kolom adalah JSONB dan enable_jsonb_stats tidak diaktifkan, statistik JSONB tidak akan dikumpulkan untuk kolom tersebut;

      • Jika Anda perlu mengandalkan statistik kolom JSONB (misalnya, kondisi filter JSON kompleks), Anda perlu mengaktifkan enable_jsonb_stats terlebih dahulu dalam atribut kolom.

Rangkuman: Bahkan setelah menjalankan ANALYZE table_name;, kolom-kolom di atas mungkin dilewati karena batasan tipe atau atribut kolom. Ketika Anda tidak dapat menemukan catatan statistik yang sesuai di pg_stats, Anda harus memeriksa batasan ini terlebih dahulu.

  • Batasan ANALYZE untuk tabel data lake

    • ANALYZE tidak didukung untuk Timestamp, Version, Branch, Snapshot, atau Tag tertentu secara individual

Penggunaan khas

  • Penggunaan khas yang direkomendasikan

    • Jalankan ANALYZE tingkat kolom pada kolom Join, kolom Group By, dan kolom kondisi filter:

ANALYZE tablename (order_id, user_id, dt);
    • Setelah impor atau pembaruan batch, jalankan pada tabel yang terpengaruh secara signifikan:

ANALYZE tablename;
    • Jalankan pada tabel eksternal (FOREIGN TABLE / IMPORT FOREIGN SCHEMA / tabel di bawah EXTERNAL DATABASE) sebelum kueri pertama:

ANALYZE foreign_table;
  • Lewati pengumpulan statistik untuk kolom tertentu dengan mengatur atribut kolom

    • Hologres mendukung pengendalian apakah ANALYZE atau AUTO ANALYZE dijalankan pada suatu kolom melalui atribut tingkat kolom, yang berlaku untuk skenario berikut:

      • Kolom ultra-lebar (seperti Text yang sangat panjang) memiliki overhead pengumpulan statistik yang tinggi, dan pengumpulan statistik untuknya memberikan manfaat terbatas atau tidak ada bagi rencana kueri;

      • Kolom tertentu tidak pernah berpartisipasi dalam Join, filtering, atau agregasi, sehingga tidak perlu pengumpulan statistik;

      • Perlu mengurangi konsumsi sumber daya ANALYZE atau AUTO ANALYZE.

    • Parameter kontrol adalah opsi kolom berikut:

      • enable_analyze: Mengontrol apakah kolom berpartisipasi dalam ANALYZE manual dan AUTO ANALYZE otomatis. Default-nya adalah true;

      • enable_auto_analyze: Mengontrol hanya apakah kolom berpartisipasi dalam AUTO ANALYZE otomatis. Default-nya adalah true.

    • Metode pengaturan (melalui perintah ALTER TABLE):

-- Nonaktifkan ANALYZE dan AUTO ANALYZE untuk kolom tertentu
ALTER TABLE t ALTER COLUMN bitmap_col SET (enable_analyze = false);

-- Nonaktifkan AUTO ANALYZE untuk kolom tertentu namun tetap mengizinkan ANALYZE manual
ALTER TABLE t ALTER COLUMN large_text_col SET (enable_auto_analyze = false);

-- Kembalikan ke perilaku default (aktifkan kembali)
ALTER TABLE t ALTER COLUMN bitmap_col RESET (enable_analyze);
ALTER TABLE t ALTER COLUMN large_text_col RESET (enable_auto_analyze);
    • Pertimbangan:

      • Setelah mengatur enable_analyze = false, kolom tersebut akan dilewati secara otomatis ketika menjalankan ANALYZE table_name;, tetapi masih dapat dikumpulkan secara eksplisit melalui ANALYZE table_name(col); manual;

      • Setelah mengatur enable_auto_analyze = false, kolom tersebut tidak akan dikumpulkan oleh AUTO ANALYZE, tetapi masih dapat dikumpulkan secara eksplisit melalui ANALYZE table_name(col); manual;

      • Jika suatu kolom memiliki dampak signifikan terhadap rencana kueri (seperti kolom Join atau kolom kondisi filter), tidak disarankan untuk menonaktifkan pengumpulan statistiknya.

Tabel partisi dan ANALYZE partisi inkremental

Untuk mengurangi overhead menjalankan ANALYZE pada tabel partisi besar, Hologres mendukung ANALYZE partisi inkremental:

  • Tujuan:

    • Menghindari sampling penuh pada tabel induk setiap kali;

    • Memperbarui statistik tabel induk dengan menjalankan ANALYZE pada partisi anak dan menggabungkan statistiknya;

    • Melewati pengumpulan ulang statistik untuk partisi anak yang tidak berubah.

Skenario dan batasan

  • Di Hologres V2.0 dan versi setelahnya, ANALYZE partisi inkremental diaktifkan secara default tanpa konfigurasi manual. Untuk detailnya, lihat catatan versi produk;

  • Ketika diaktifkan, menjalankan ANALYZE pada partisi anak akan mencoba menggabungkan statistiknya dengan statistik partisi anak lain untuk menghasilkan statistik tabel induk;

  • Prasyarat untuk menggabungkan statistik tabel induk adalah, selain partisi anak yang sedang dianalisis, semua partisi anak lain di bawah tabel induk harus sudah memiliki statistik (termasuk statistik jumlah baris dan statistik kolom);

  • Oleh karena itu, Anda dapat:

    • Saat penyiapan awal, jalankan ANALYZE pada tabel induk terlebih dahulu. Sistem akan secara otomatis mendeteksi partisi anak yang memerlukan ANALYZE dan menganalisisnya satu per satu, akhirnya menggabungkan hasilnya ke dalam statistik tabel induk;

    • Ketika partisi baru ditambahkan nanti, Anda hanya perlu menjalankan ANALYZE pada partisi anak yang baru ditambahkan.

Contoh singkat

BEGIN;
DROP TABLE IF EXISTS t_parent;
CREATE TABLE t_parent(a int, b int) PARTITION BY LIST (a);
CREATE TABLE child1 PARTITION OF t_parent FOR VALUES IN (1);
CREATE TABLE child2 PARTITION OF t_parent FOR VALUES IN (2);
COMMIT;
insert into child1 values (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 2);
insert into child2 values (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 5), (2, 5), (2, 5), (2, 5), (2, 5);

-- child2 tidak memiliki statistik, sehingga statistik tabel induk tidak dapat digabung
dbname=# ANALYZE child1;
INFO:  auto merging of leaf partition stats to calculate root partition stats is not possible because partition child2 is not analyzed
ANALYZE

-- child1 sudah memiliki statistik. Setelah menganalisis child2, statistik tabel induk dapat digabung secara otomatis
dbname=# ANALYZE child2;
ANALYZE

dbname=# SELECT tablename,
       attname,
       null_frac         AS "NF",
       avg_width,
       n_distinct,
       most_common_vals  AS "MCV",
       most_common_freqs AS "MCV_FRAQ"
FROM   pg_stats
WHERE  tablename = 't_parent';

 tablename | attname | NF | avg_width | n_distinct |  MCV  |  MCV_FRAQ
-----------+---------+----+-----------+------------+-------+------------
 t_parent  | a       |  0 |         4 |          2 | {1,2} | {0.5,0.5}
 t_parent  | b       |  0 |         4 |       -0.2 | {1,5} | {0.45,0.3}
(2 rows)

-- Setelah ini, ketika partisi baru ditambahkan, Anda hanya perlu menjalankan ANALYZE pada partisi anak. Statistik tabel induk akan digabung secara otomatis hanya dengan sampling pada partisi anak tersebut.

ANALYZE pada tabel induk

Terkadang beberapa partisi anak dari tabel partisi mengalami perubahan data, dan Anda tidak ingin menjalankan ANALYZE pada setiap partisi anak secara individual. Dalam kasus ini, Anda dapat melakukan ANALYZE tunggal pada tabel induk.

Ketika ANALYZE partisi inkremental diaktifkan, menjalankan ANALYZE secara manual pada tabel induk menyebabkan sistem secara adaptif memilih partisi anak yang memerlukan pembaruan statistik, alih-alih menganalisis semua partisi anak secara membabi buta. Mekanisme ini secara signifikan mengurangi overhead ANALYZE untuk tabel partisi besar sekaligus memastikan akurasi statistik.

Deskripsi perilaku

Ketika menjalankan ANALYZE partition_parent_table;, sistem secara otomatis mengidentifikasi dua jenis partisi anak berikut, memprioritaskan pengumpulan statistik ANALYZE-nya, lalu menggabungkannya ke dalam statistik tabel induk:

  1. Partisi dengan perubahan statistik

    • Data partisi anak telah berubah secara signifikan sejak ANALYZE terakhir (insert, update, atau delete);

    • Kriteria penentuan:

      • Jumlah baris yang berubah mencapai ambang batas perubahan (1% * jumlah baris pada ANALYZE terakhir).

  2. Partisi yang tidak dapat digabung

    • Partisi anak tidak memiliki statistik lengkap, sehingga tidak dapat berpartisipasi dalam penggabungan statistik tabel induk;

    • Penyebab umum meliputi:

      • ANALYZE belum pernah dijalankan: Statistik partisi anak benar-benar tidak tersedia;

      • Statistik kolom tidak tersedia: Kolom tertentu tidak memiliki statistik yang diperlukan (seperti MCV, Histogram, atau NDV HLL Counter);

      • Ketidakcocokan tipe statistik dengan tipe kolom: Tipe kolom partisi anak telah berubah, menyebabkan statistik yang ada tidak konsisten dengan tipe kolom saat ini;

      • Versi statistik usang: Versi statistik tabel induk (statistic_version) lebih rendah daripada versi statistik partisi anak terbaru, menunjukkan bahwa statistik tabel induk belum mutakhir dan perlu digabung ulang.

Contoh eksekusi dan output

-- Jalankan ANALYZE pada tabel induk
ANALYZE partition_parent_table;

Output khas:

INFO:  will analyze 5 part tables first (stats changed 3, unable-to-merge 2)

Output ini menunjukkan:

  • Sistem mengidentifikasi 5 partisi anak yang perlu pengumpulan statistik prioritas;

  • Diantaranya, 3 partisi anak memerlukan pembaruan statistik karena perubahan data yang signifikan;

  • Diantaranya, 2 partisi anak ditandai sebagai tidak dapat digabung karena statistik yang hilang atau tidak dapat digunakan, sehingga perlu memicu ANALYZE internal terlebih dahulu.

Catatan

  • Tidak disarankan untuk mengatur autovacuum_enabled = false (menonaktifkan AUTO ANALYZE tingkat tabel) untuk partisi anak, karena hal ini dapat menyebabkan partisi anak tetap dalam keadaan "tidak dapat digabung" untuk jangka waktu yang lama kecuali Anda menjalankan ANALYZE secara manual lagi.

Melalui mekanisme ini, Hologres dapat secara signifikan meningkatkan efisiensi eksekusi ANALYZE untuk tabel partisi besar sekaligus memastikan kualitas statistik, memberikan data pengambilan keputusan yang lebih tepat waktu dan akurat kepada pengoptimal kueri.

ANALYZE untuk tabel partisi logis

Tabel partisi logis adalah jenis tabel partisi yang unik untuk Hologres. Berbeda dengan tabel partisi PostgreSQL standar (yang membuat tabel anak fisik melalui PARTITION BY), tabel partisi logis tetap secara fisik sebagai satu tabel tunggal dan hanya mempartisi data secara logis berdasarkan nilai kolom partisi, memberikan kemampuan manajemen partisi yang lebih fleksibel.

Logika ANALYZE untuk tabel partisi logis pada dasarnya sama dengan tabel partisi fisik. Satu-satunya perbedaan adalah bahwa partisi anak dari tabel partisi logis bukanlah tabel terpisah, tetapi seperti partisi anak fisik, masing-masing tetap memiliki statistik jumlah baris dan statistik kolom yang independen.

Deskripsi perilaku

Ketika menjalankan ANALYZE pada tabel partisi logis, sistem menggunakan logika pemrosesan yang mirip tetapi independen dari tabel partisi fisik:

  1. Penemuan otomatis partisi logis

    • Ketika menjalankan ANALYZE logical_partitioned_table; pada tabel (induk) partisi logis, sistem secara otomatis menanyakan mesin penyimpanan untuk semua partisi logis tabel tersebut;

  2. Pemilihan adaptif partisi logis yang memerlukan statistik

    • Seperti pada tabel partisi fisik, sistem mengidentifikasi partisi logis berikut dan memprioritaskan pengumpulan statistiknya:

    • Partisi dengan perubahan statistik

      • Data partisi anak telah berubah secara signifikan sejak ANALYZE terakhir (insert, update, atau delete), dengan kriteria penentuan yang sama seperti pada tabel partisi fisik yang dijelaskan di atas;

      • Partisi logis dengan statistik yang hilang: ANALYZE belum pernah dijalankan, atau kolom tertentu tidak memiliki statistik yang diperlukan (seperti counter HLL);

      • Partisi logis dengan statistik yang tidak dapat digunakan: Statistik kolom tidak cocok dengan tipe kolom saat ini, atau statistiknya sudah usang.

    • Partisi kosong dilewati: Partisi logis dengan 0 baris diabaikan secara otomatis.

    • Sistem mengeluarkan pesan informasi, misalnya:

    INFO:  will analyze 10 logical partitions first
  3. Sampling dan pengumpulan statistik per partisi

    • Untuk setiap partisi logis yang memerlukan pengumpulan statistik, sistem membuat kueri sampling dengan kondisi filter kolom partisi (seperti WHERE user_id = 1 AND event_date = '2024-11-04');

    • Sampling data dilakukan dalam cakupan partisi logis tersebut untuk mengumpulkan statistik tingkat kolom (NDV, MCV, Histogram, counter HLL, dll.);

    • Statistik disimpan pada granularitas partisi logis di hologres_statistic.hg_table_statistic, dibedakan berdasarkan field unique_name untuk partisi logis yang berbeda.

  4. Menggabungkan statistik tabel induk

    • Setelah pengumpulan statistik untuk semua partisi logis selesai, sistem secara otomatis memicu penggabungan statistik untuk menghasilkan statistik tabel induk.

Contoh eksekusi dan output

Contoh 1: Jalankan ANALYZE pada tabel induk partisi logis

-- Buat tabel partisi logis
CREATE TABLE user_events (
    user_id INT NOT NULL,
    event_type TEXT NOT NULL,
    event_date DATE NOT NULL,
    event_data INT
)
LOGICAL PARTITION BY LIST(user_id, event_date);

-- Masukkan data ke partisi logis yang berbeda
INSERT INTO user_events SELECT 1, 'login', '2024-11-01', i FROM generate_series(1, 1000) i;
INSERT INTO user_events SELECT 1, 'logout', '2024-11-02', i FROM generate_series(1, 1000) i;
INSERT INTO user_events SELECT 2, 'purchase', '2024-11-03', i FROM generate_series(1, 1000) i;
INSERT INTO user_events SELECT 3, 'view', '2024-11-04', i FROM generate_series(1, 1000) i;

-- Jalankan ANALYZE pada tabel induk
ANALYZE VERBOSE user_events;

Output khas:

INFO:  will analyze 4 logical partitions first
INFO:  analyzing hologres table "public.user_events" PARTITION (user_id=1,event_date='2024-11-01')
INFO:  analyzing hologres table "public.user_events" PARTITION (user_id=1,event_date='2024-11-02')
INFO:  analyzing hologres table "public.user_events" PARTITION (user_id=2,event_date='2024-11-03')
INFO:  analyzing hologres table "public.user_events" PARTITION (user_id=3,event_date='2024-11-04')
INFO:  try to merge root partition
INFO:  automatically merging leaf partition stats to calculate root partition stats

Deskripsi:

  • Sistem secara otomatis menemukan 4 partisi logis yang memerlukan pembaruan statistik;

  • Statistik dikumpulkan untuk setiap partisi logis satu per satu;

  • Akhirnya, statistik global tabel induk digabung dan dihasilkan secara otomatis.

Contoh 2: Jalankan ANALYZE pada partisi logis tertentu

-- Jalankan ANALYZE pada satu partisi logis
ANALYZE user_events PARTITION (user_id=1, event_date='2024-11-01');

-- Jalankan ANALYZE pada beberapa partisi logis
ANALYZE user_events
    PARTITION (user_id=1, event_date='2024-11-01')
    PARTITION (user_id=2, event_date='2024-11-03');

-- Jalankan ANALYZE pada kolom tertentu dari partisi logis yang ditentukan
ANALYZE user_events
    PARTITION (user_id=1, event_date='2024-11-01') (user_id, event_type);

Deskripsi:

  • Anda dapat menggunakan klausa PARTITION untuk menentukan partisi logis mana yang akan dianalisis;

  • Beberapa partisi logis dapat ditentukan sekaligus;

  • Seperti pada ANALYZE standar, Anda dapat lebih lanjut menentukan kolom untuk mengumpulkan statistik.

Penyimpanan statistik

Statistik untuk tabel partisi logis disimpan di tabel hologres_statistic.hg_table_statistic:

SELECT
    unique_name,
    schema_name,
    table_name,
    total_rows,
    sample_rows,
    nattr
FROM hologres_statistic.hg_table_statistic
WHERE table_name = 'user_events'
ORDER BY unique_name;

Hasil contoh:

| unique_name | schema_name | table_name | total_rows | sample_rows | nattr |
|-------------|-------------|------------|------------|-------------| ----- |
| user_events | public | user_events | 4000 | 0 | 4 |
| user_events.a1b2c3d4e5f6... | public | user_events | 1000 | 1000 | 4 |
| user_events.f6e5d4c3b2a1... | public | user_events | 1000 | 1000 | 4 |
| user_events.1234567890ab... | public | user_events | 1000 | 1000 | 4 |
| user_events.abcdef123456... | public | user_events | 1000 | 1000 | 4 |

Deskripsi field:

  • Catatan tabel induk:

    • total_rows = 4000: Total jumlah baris di semua partisi logis;

    • sample_rows = 0: Statistik tabel induk diperoleh melalui penggabungan, tanpa sampling langsung.

  • Catatan partisi logis (unique_name berisi hash MD5 yang mengidentifikasi objek statistik (tabel/partisi)):

    • Setiap partisi logis memiliki catatan statistik independen;

    • sample_rows = 1000: Jumlah baris aktual yang disampling untuk partisi logis tersebut.

Praktik terbaik untuk ANALYZE tabel partisi logis

  1. Lebih baik menjalankan ANALYZE pada tabel induk partisi logis

    • Ketika menjalankan ANALYZE pada tabel induk partisi logis, sistem secara otomatis menemukan dan mengumpulkan statistik untuk semua partisi logis tanpa perlu menentukan setiap partisi secara manual;

    • Hanya gunakan klausa PARTITION untuk menentukan partisi ketika Anda perlu memperbarui statistik dengan cepat untuk partisi logis tertentu.

  2. Manfaatkan pembaruan statistik inkremental

    • Ketika data hanya ditulis ke beberapa partisi logis, Anda dapat menjalankan ANALYZE hanya pada partisi tersebut;

    • Sistem akan secara otomatis memicu penggabungan statistik tabel induk tanpa perlu mengumpulkan ulang statistik untuk semua partisi.

  3. Perhatikan jumlah partisi logis

    • Ketika terdapat terlalu banyak partisi logis (misalnya ribuan), ANALYZE awal mungkin memakan waktu lama. Disarankan untuk menjalankannya selama jam sepi;

  4. Pertimbangan performa terkait versi untuk tabel partisi logis

    • Pada versi sebelum V4.1.20, menjalankan ANALYZE pada tabel partisi logis mungkin mengalami penurunan performa signifikan (waktu eksekusi yang panjang dengan jeda sekitar 10 detik). Hal ini disebabkan oleh kontensi lock antara proses ANALYZE foreground dan tugas pemuatan statistik latar belakang (trigger load stats): saat ANALYZE melakukan iterasi melalui sub-partisi dari tabel partisi logis yang sama, ia terus-menerus menghasilkan entri binlog statistik, yang memicu pemuatan statistik latar belakang berulang untuk tabel dan versi yang sama, mengakibatkan kontensi lock SUE (Statistics Update Exclusive).

    • Pada versi V4.2.5 dan setelahnya, masalah ini telah dioptimalkan melalui deduplikasi proses pemuatan statistik latar belakang, menghilangkan operasi pemuatan berlebihan untuk tabel dan versi yang sama. Jika Anda mengalami performa ANALYZE yang lambat pada tabel partisi logis, disarankan untuk melakukan upgrade ke V4.2.5 atau versi setelahnya.

  5. Gunakan bersamaan dengan AUTO ANALYZE

    • Tabel partisi logis juga dikelola oleh AUTO ANALYZE, yang secara otomatis mengidentifikasi partisi logis yang memerlukan pembaruan statistik.

Parameter yang dapat dikonfigurasi untuk perintah ANALYZE

Parameter

Deskripsi

Versi Didukung

Nilai Default

Catatan / Contoh Penggunaan

hg_experimental_analyze_foreign_partitions_access_limit

Jumlah maksimum partisi yang diizinkan diakses selama sampling acak ketika menjalankan ANALYZE pada tabel eksternal

v0.10 dan setelahnya

0 (tidak terbatas)

-- Hanya sampling 100 partisi untuk mencegah sampling acak memindai terlalu banyak data tabel eksternal

ALTER DATABASE dbname SET hg_experimental_analyze_foreign_partitions_access_limit = 100;

hg_analyze_foreign_table_max_sample_row_count

Jumlah maksimum baris yang disampling selama sampling acak ketika menjalankan ANALYZE pada tabel eksternal

v4.1 dan setelahnya

0 (tidak terbatas). Untuk detailnya, lihat pembaruan versi.

Pengumpulan statistik otomatis AUTO ANALYZE

Mulai dari Hologres V0.10, Hologres mendukung mekanisme pengumpulan statistik otomatis AUTO ANALYZE:

  • Secara otomatis menentukan tabel mana yang memerlukan pembaruan statistik berdasarkan pembuatan tabel, penulisan data, dan perubahan data;

  • Menjadwalkan tugas pengumpulan statistik secara asinkron di latar belakang, menghilangkan kebutuhan bagi pengguna untuk menjalankan ANALYZE secara manual pada setiap tabel;

  • Mengurangi risiko statistik yang hilang karena kelalaian menjalankan ANALYZE.

Sakelar dan cakupan

Sakelar tingkat database

  • Parameter yang dapat dikonfigurasi adalah hg_enable_start_auto_analyze_worker. Mulai dari Hologres V0.10, parameter ini diaktifkan secara default.

-- Periksa apakah AUTO ANALYZE diaktifkan untuk database saat ini
SHOW hg_enable_start_auto_analyze_worker;

-- Nonaktifkan (gunakan hanya untuk troubleshooting sementara)
ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = OFF;

-- Atur ulang ke nilai default ON (direkomendasikan)
ALTER DATABASE dbname RESET hg_enable_start_auto_analyze_worker;

Catatan: GUC di atas adalah konfigurasi tingkat database. Konfigurasi tingkat SESSION atau ROLE tidak efektif. Harus diatur melalui ALTER DATABASE agar berlaku pada database tersebut, dan hanya superuser yang dapat memodifikasinya.

Sakelar tingkat tabel

Hologres mendukung pengendalian perilaku AUTO ANALYZE untuk tabel individual.

Deskripsi perilaku

  • Nonaktifkan AUTO ANALYZE untuk satu tabel

ALTER TABLE my_table SET (autovacuum_enabled = false);
  • Aktifkan AUTO ANALYZE untuk satu tabel (kembalikan perilaku default)

-- Direkomendasikan: atur ulang untuk mengembalikan default
ALTER TABLE my_table RESET (autovacuum_enabled);

-- Atau atur eksplisit ke true (tidak direkomendasikan)
ALTER TABLE my_table SET (autovacuum_enabled = true);
  • Periksa status autovacuum_enabled suatu tabel

SELECT relname, reloptions FROM pg_class WHERE relname = 'my_table';

 relname  |         reloptions
----------+----------------------------
 my_table | {autovacuum_enabled=false}
(1 row)

Kasus penggunaan khas

  1. Tabel bisnis khusus yang tidak memerlukan statistik

    • Beberapa tabel hanya digunakan untuk penyimpanan sementara atau logging dan tidak berpartisipasi dalam kueri kompleks, sehingga pengumpulan statistik tidak diperlukan;

    • Tabel dengan volume data besar yang berubah secara frekuen tetapi tidak memerlukan statistik dapat menghindari konsumsi sumber daya yang tidak perlu dengan mengatur autovacuum_enabled = false.

  2. Statistik sudah dikelola secara manual

    • Untuk tabel kritis tertentu, Anda mungkin telah menetapkan alur kerja ANALYZE manual rutin yang memenuhi kebutuhan bisnis Anda.

  3. Nonaktifkan sementara untuk mengurangi penggunaan sumber daya

    • Selama jam sibuk bisnis atau troubleshooting darurat, Anda dapat menonaktifkan sementara AUTO ANALYZE untuk tabel tertentu;

    • Setelah situasi terselesaikan, aktifkan kembali atau jalankan ANALYZE secara manual.

Pertimbangan

  • Untuk tabel partisi:

    • Tidak disarankan untuk mengatur autovacuum_enabled = false pada partisi anak, karena hal ini dapat menyebabkan partisi anak tetap dalam keadaan "tidak dapat digabung" untuk jangka waktu yang lama, memengaruhi akurasi statistik tabel induk;

    • Jika Anda perlu menonaktifkannya, disarankan hanya mengaturnya pada tabel partisi induk.

  • Sakelar tingkat tabel memiliki prioritas lebih tinggi daripada sakelar tingkat database:

    • Bahkan jika AUTO ANALYZE tingkat database diaktifkan, tabel dengan autovacuum_enabled = false tidak akan diproses oleh AUTO ANALYZE.

Sakelar tingkat kolom

Hologres mendukung pengendalian apakah ANALYZE atau AUTO ANALYZE dilakukan pada kolom tertentu melalui atribut tingkat kolom, yang berlaku untuk skenario berikut:

  • Kolom lebar (seperti field Text panjang) memiliki overhead pengumpulan statistik yang tinggi tetapi memberikan manfaat terbatas bagi rencana kueri;

  • Kolom tertentu tidak pernah berpartisipasi dalam Join, filter, atau agregasi dan tidak memerlukan pengumpulan statistik;

  • Perlu mengurangi konsumsi sumber daya AUTO ANALYZE.

Parameter kontrol adalah opsi kolom berikut:

  • enable_auto_analyze: Mengontrol hanya apakah kolom berpartisipasi dalam AUTO ANALYZE otomatis, default-nya adalah true.

  • Metode konfigurasi (melalui perintah ALTER TABLE):

-- Nonaktifkan AUTO ANALYZE untuk kolom tertentu namun tetap mengizinkan ANALYZE manual
ALTER TABLE t ALTER COLUMN large_text_col SET (enable_auto_analyze = false);

-- Kembalikan ke perilaku default (aktifkan kembali)
ALTER TABLE t ALTER COLUMN large_text_col RESET (enable_auto_analyze);
  • Pertimbangan:

    • Setelah mengatur enable_auto_analyze = false pada tingkat kolom, tugas AUTO ANALYZE tidak akan lagi mengumpulkan statistik untuk kolom tersebut. Namun, Anda masih dapat mengumpulkan statistik secara eksplisit melalui ANALYZE table_name; atau ANALYZE table_name(col); manual;

    • Jika suatu kolom memiliki dampak signifikan terhadap rencana kueri (seperti kolom Join atau kolom kondisi filter), tidak disarankan untuk menonaktifkan pengumpulan statistiknya.

Logika pemicu AUTO ANALYZE

AUTO ANALYZE menggabungkan berbagai jenis sinyal untuk menentukan apakah statistik perlu diperbarui untuk tabel tertentu:

  1. Volume Perubahan Data

    • Hanya berlaku untuk tabel Hologres reguler (tidak termasuk tabel eksternal);

    • Pada interval 1 menit, mengumpulkan jumlah baris operasi INSERT/UPDATE/DELETE yang diamati FE pada setiap tabel. Jika perubahan melebihi ambang batas, AUTO ANALYZE dipicu (respons cepat);

    • Pada interval 10 menit, mengambil jumlah baris perubahan insert/update/delete dari mesin penyimpanan. Jika perubahan melebihi ambang batas, AUTO ANALYZE dipicu (kalibrasi presisi);

  2. Perubahan Skema

    • Hanya berlaku untuk tabel Hologres reguler (tidak termasuk tabel eksternal);

    • Pada interval 1 menit, mengumpulkan tabel dengan perubahan berikut dan melakukan AUTO ANALYZE:

      • ADD / DROP COLUMN;

      • Tabel partisi (termasuk tabel partisi logis) ATTACH / DETACH partisi anak.

  3. Statistik Hilang / Tidak Dapat Menggabung Statistik Tabel Partisi Induk

    • Berlaku untuk tabel Hologres reguler dan tabel eksternal;

    • Pada interval 1 menit, mengumpulkan tabel/kolom dengan statistik yang hilang dan partisi anak yang tidak memenuhi syarat untuk penggabungan statistik inkremental.

  4. Tabel Eksternal

    • Hanya berlaku untuk tabel eksternal yang diperkenalkan melalui CREATE FOREIGN TABLE, IMPORT FOREIGN SCHEMA, atau mekanisme Auto Load di bawah konteks non-External Database;

    • Saat ini hanya mendukung AUTO ANALYZE untuk tabel eksternal MaxCompute;

    • Pada interval 4 jam, secara berkala memeriksa semua tabel eksternal di DB. Di antara dua pemeriksaan, jika terdapat perubahan data eksternal (kriterianya adalah last_modify_timestamp tabel eksternal yang sesuai berada di antara dua interval pemeriksaan), AUTO ANALYZE dipicu.

  5. Statistik Cadangan

    • Selama jendela 01.00–05.00 pagi, AUTO ANALYZE "cadangan" dilakukan pada tabel yang mengalami perubahan terus-menerus tetapi belum memicu ambang batas (>5000 baris berubah, <10% volume perubahan), untuk menangkap deviasi distribusi data di kolom (misalnya, field bertipe tanggal yang ditulis setelah tengah malam hari berikutnya sangat berbeda dari hari sebelumnya, mengakibatkan perubahan distribusi).

  6. Mengakses Tabel Hotspot (Hanya untuk Database Eksternal)

    • Setelah mengaktifkan parameter enable_auto_analyze pada External Database, sistem Hologres mulai melacak tabel yang baru-baru ini diakses sejak startup sistem terakhir dan menambahkannya ke daftar observasi;

    • Pada interval 1 jam, tabel dalam daftar observasi yang "sering diakses baru-baru ini" memicu AUTO ANALYZE;

    • Perhatikan bahwa setelah restart sistem, daftar tabel yang diakses dihapus dan pencatatan dimulai kembali.

AUTO ANALYZE untuk External Database

  • Mulai dari Hologres V3.0, Hologres mendukung fitur External Database. Saat membuat External Database, Anda dapat mengaktifkan AUTO ANALYZE (secara default dinonaktifkan, lihat catatan rilis untuk detailnya):

-- Aktifkan AUTO ANALYZE saat membuat External Database
-- Referensi: https://www.alibabacloud.com/help/zh/hologres/developer-reference/create-external-database
CREATE EXTERNAL DATABASE <ext_database_name> WITH
  metastore_type 'maxcompute'
  mc_project 'project_name'
  enable_auto_analyze 'true';

-- Aktifkan AUTO ANALYZE untuk External Database yang sudah ada
ALTER EXTERNAL DATABASE dbname WITH enable_auto_analyze 'true';

Batasan fitur: Untuk V3.2 dan versi sebelumnya, AUTO ANALYZE untuk External Database mengharuskan pernyataan CREATE EXTERNAL DATABASE dikonfigurasi dengan Access Key dan Access Secret. AUTO ANALYZE tidak didukung untuk External Database yang dikonfigurasi dengan SLR atau STS. Tidak ada batasan seperti ini untuk V4.0 dan versi setelahnya.

  • Cakupan metastore_type yang didukung AUTO ANALYZE pada External Database adalah: dlf, dlf-paimon, dlf-rest, maxcompute.

  • Format tabel yang didukung AUTO ANALYZE pada External Database meliputi: MaxCompute, Paimon, Iceberg.

  • AUTO ANALYZE pada External Database menggunakan identitas Owner External Database secara default, dan menggunakan autentikasi Time-based One-Time Password (TOTP) untuk menjalankan tugas ANALYZE. Jika Owner tidak memiliki izin tabel yang cukup, sistem tidak dapat menjalankan tugas AUTO ANALYZE dengan sukses.

  • Agar tabel eksternal dalam External Database memenuhi syarat untuk AUTO ANALYZE, kondisi berikut harus terpenuhi:

    • Konfigurasi External Database hg_enable_start_auto_analyze_worker = on; (default-nya on)

    • Atribut External Database enable_auto_analyze diatur ke true (tidak dikonfigurasi secara default, yang berarti false, lihat catatan rilis untuk detailnya)

    • Owner External Database harus memiliki izin kueri untuk Project data lake (jika berlaku) dan tabel tersebut

    • Tabel tersebut harus telah diakses setidaknya satu kali dalam 3 hari terakhir

      • AUTO ANALYZE di bawah External Database hanya memantau tabel eksternal yang telah diakses setidaknya satu kali;

      • Setelah restart sistem, jika tabel eksternal diakses setidaknya satu kali, sistem AUTO ANALYZE menambahkannya ke daftar observasi dan secara berkala memicu AUTO ANALYZE untuk tabel-tabel tersebut;

Catatan: Untuk tabel eksternal dalam External Database yang belum pernah diakses, akses pertama menggunakan mekanisme estimasi jumlah baris cepat untuk mendapatkan jumlah baris sebagai statistik cadangan (lihat bagian "Estimasi Jumlah Baris Cepat" di bawah), yang masih memberikan cakupan statistik tertentu.

Batasan sumber daya AUTO ANALYZE

Untuk mencegah tugas AUTO ANALYZE latar belakang memengaruhi tugas pengguna foreground, Hologres telah menetapkan batasan sumber daya berikut untuk fitur AUTO ANALYZE:

  • Ketika tugas AUTO ANALYZE dijalankan, batas memori default per worker adalah 4 GB. Jika volume data tabel terlalu besar, sampling mungkin melebihi batas memori, menyebabkan SQL sampling AUTO ANALYZE gagal. Dalam kasus seperti ini, hanya informasi jumlah baris yang dapat dikumpulkan, dan informasi distribusi kolom (MCV, Histogram, NDV, dll.) tidak dapat dikumpulkan. Anda dapat menyesuaikan auto_analyze_work_memory_mb untuk mengubah perilaku ini. Semakin besar spesifikasi instans, semakin tinggi batas memori yang tersedia untuk AUTO ANALYZE.

  • Konkurensi tingkat instans untuk tugas AUTO ANALYZE yang dijadwalkan secara simultan biasanya tidak melebihi 4, dan dalam kasus ekstrem tidak melebihi 6.

  • Untuk tugas AUTO ANALYZE partisi anak di bawah tabel partisi yang sama, konkurensi penjadwalan simultan maksimum adalah 3.

  • Secara default, AUTO ANALYZE mengumpulkan statistik untuk 256 kolom pertama. Jika tabel memiliki lebih dari 256 kolom, hanya 256 kolom pertama yang dikumpulkan (untuk tabel partisi, kolom partisi diprioritaskan dan akan dikumpulkan bahkan jika posisinya melebihi 256). Anda dapat menyesuaikan hg_experimental_auto_analyze_max_columns_count untuk mengubah nilai ini.

  • Sub-SQL sampling tugas AUTO ANALYZE dijalankan menggunakan Background Pool prioritas rendah dengan konkurensi eksekusi kueri yang terbatas. Hal ini menyebabkan tugas AUTO ANALYZE memakan waktu lebih lama daripada ANALYZE manual, yang tidak perlu dikhawatirkan pengguna.

  • Untuk tabel eksternal, AUTO ANALYZE hanya mengumpulkan statistik kolom untuk kolom partisi (misalnya, MCV). Tidak melakukan sampling untuk mengumpulkan statistik kolom untuk kolom selain kolom partisi.

Parameter yang dapat dikonfigurasi AUTO ANALYZE

Secara default, fitur AUTO ANALYZE Hologres tidak memerlukan modifikasi parameter apa pun.

Dalam skenario bisnis langka (seperti penulisan/pembaruan data yang jarang, beban kerja kueri yang tidak memerlukan statistik, atau peningkatan beban sistem yang disebabkan oleh AUTO ANALYZE), pengguna dapat memodifikasi parameter default tertentu untuk menyesuaikan perilaku AUTO ANALYZE demi intervensi atau penyetelan performa parsial.

Catatan: Hanya superuser yang dapat menyesuaikan perilaku default AUTO ANALYZE. Semua parameter harus diatur pada tingkat DB dan berlaku setelah menit berikutnya.

-- Superuser: modifikasi parameter default AUTO ANALYZE pada tingkat database
ALTER DATABASE dbname SET <GUC> = <values>;

Parameter

Deskripsi

Versi Didukung

Nilai Default

Catatan / Contoh Penggunaan

hg_enable_start_auto_analyze_worker

Mengaktifkan fitur AUTO ANALYZE

V0.10 dan setelahnya

on

-- Nonaktifkan sementara AUTO ANALYZE untuk DBALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = off;

hg_experimental_auto_analyze_max_columns_count

Jumlah kolom yang dikumpulkan statistiknya secara otomatis oleh AUTO ANALYZE

V1.1.0 dan setelahnya

256

ALTER DATABASE dbname SET hg_experimental_auto_analyze_max_columns_count =300;

auto_analyze_work_memory_mb

Batas memori untuk satu tabel dalam AUTO ANALYZE, dalam MB

V1.1.54 dan setelahnya

4096

-- Ubah menjadi 9 GBALTER DATABASE dbname SET auto_analyze_work_memory_mb = 9216;Default-nya 4 GB per worker. Semakin besar spesifikasi instans, semakin banyak worker, dan semakin tinggi batas memori aktual.)

auto_analyze_work_statement_timeout

Timeout eksekusi tugas AUTO ANALYZE, dalam ms

V2.0 dan setelahnya

3600000

-- Ubah menjadi 3hALTER DATABASE dbname SET auto_analyze_work_statement_timeout = '3h';

hg_experimental_auto_analyze_max_foreign_table_partitions

Jumlah maksimum partisi tabel eksternal yang diakses selama AUTO ANALYZE

V1.1.54 dan setelahnya

100

Jika jumlah partisi tabel eksternal melebihi 100, jumlah baris dari 100 partisi teratas berdasarkan urutan leksikografis nilai partisi tingkat pertama digunakan secara default untuk memperkirakan jumlah baris keseluruhan dan MCV kolom partisi tabel eksternal.

hg_auto_analyze_run_with_serverless_computing

Apakah AUTO ANALYZE dijalankan menggunakan sumber daya Serverless

V3.1 dan setelahnya

off (default-nya on untuk instans Serverless)

Umumnya tidak perlu penyesuaian. AUTO ANALYZE biasanya mengonsumsi sumber daya minimal dan dijalankan di latar belakang menggunakan proses prioritas rendah, dengan dampak minimal pada beban instans.

hg_auto_analyze_serverless_computing_query_priority

Prioritas tugas Serverless, rentang 1-5, nilai lebih tinggi menunjukkan prioritas lebih tinggi. Catatan: hg_auto_analyze_run_with_serverless_computing harus diaktifkan terlebih dahulu

V3.1 dan setelahnya

2

-- Ubah menjadi prioritas tertinggiALTER DATABASE dbname SET hg_auto_analyze_serverless_computing_query_priority = 5;

Estimasi jumlah baris cepat (Fast Num of Rows)

Mulai dari Hologres V3.1, Hologres memperkenalkan fitur estimasi jumlah baris cepat. Ketika mendeteksi bahwa tabel dalam kueri SQL yang dieksekusi tidak memiliki statistik atau statistiknya mungkin sudah usang, Hologres dapat dengan cepat memperkirakan jumlah baris tabel melalui metadata dari penyimpanan dasar atau sistem eksternal, sehingga menghasilkan rencana eksekusi yang lebih masuk akal.

Mulai dari Hologres V3.2, fitur estimasi jumlah baris cepat (Fast Num of Rows) diaktifkan secara default.

Sakelar

Cara mengaktifkan estimasi jumlah baris cepat:

-- Nonaktifkan (gunakan hanya untuk troubleshooting sementara atau ketika statistik tidak diperlukan untuk seluruh database)
ALTER DATABASE dbname SET hg_experimental_get_fast_num_of_rows = OFF;

-- V3.2 dan setelahnya: aktifkan (atur ulang ke nilai default)
ALTER DATABASE dbname RESET hg_experimental_get_fast_num_of_rows;

-- V3.1 dan sebelumnya: aktifkan
ALTER DATABASE dbname SET hg_experimental_get_fast_num_of_rows = ON;

Catatan: Estimasi jumlah baris cepat tidak dapat menggantikan pengumpulan statistik lengkap. Masih disarankan untuk menjaga statistik tetap mutakhir pada tabel bisnis kritis melalui ANALYZE/AUTO ANALYZE.

Batasan penggunaan

  • Estimasi jumlah baris cepat berlaku untuk tabel reguler (termasuk tabel partisi), tabel eksternal dalam External Database, dan skenario lainnya.

  • Jumlah baris yang diperkirakan oleh fitur estimasi jumlah baris cepat tidak dijamin sepenuhnya akurat. Misalnya, demi alasan performa, pada tabel partisi Hologres, hanya statistik jumlah baris dari maksimal 60 partisi (secara default) yang digunakan untuk memperkirakan jumlah baris keseluruhan tabel partisi.

  • Pada V4.1.15 dan versi sebelumnya, estimasi jumlah baris cepat tidak diaktifkan secara default untuk tipe tabel eksternal (Foreign Table). Dapat diaktifkan melalui parameter hg_experimental_enable_foreign_table_get_fast_num_of_rows. Diaktifkan secara default pada V4.1.16 dan versi setelahnya.

  • Untuk tipe tabel eksternal, estimasi jumlah baris cepat hanya mendukung tabel eksternal MaxCompute, tabel eksternal Paimon, dan tabel eksternal Iceberg.

Contoh

  1. Contoh hg_experimental_get_fast_num_of_rows

Jika tabel tidak memiliki statistik, mengaktifkan estimasi jumlah baris cepat dapat memberikan jumlah baris yang lebih akurat. (Diaktifkan secara default di Hologres V3.2 dan versi setelahnya)

-- V3.2+
create table test_tbl (a int);
insert into test_tbl select * from generate_series (1, 999);

-- Estimasi jumlah baris akurat (rows=999)
explain select count(1) from test_tbl ;
                                       QUERY PLAN
----------------------------------------------------------------------------------------
 Final Aggregate  (cost=0.00..5.00 rows=1 width=8)
   ->  Gather  (cost=0.00..5.00 rows=10 width=8)
         ->  Partial Aggregate  (cost=0.00..5.00 rows=10 width=8)
               ->  Local Gather  (cost=0.00..5.00 rows=20 width=8)
                     ->  Partial Aggregate  (cost=0.00..5.00 rows=20 width=8)
                           ->  Seq Scan on test_tbl  (cost=0.00..5.00 rows=999 width=1)

Berikut adalah kasus produksi nyata:

Tanpa fitur ini diaktifkan, jika tabel tidak memiliki statistik, node Scan dalam rencana kueri akan menunjukkan rows=1000 (menunjukkan tidak tersedia statistik, dan rencana dihasilkan berdasarkan estimasi default 1000 baris).

Setelah mengaktifkan fitur ini, jika tabel tidak memiliki statistik, rows node Scan dalam rencana kueri tidak akan sama dengan 1000 (sistem memanggil metadata dari mesin penyimpanan dasar untuk mendapatkan jumlah baris tabel).

Parameter yang dapat dikonfigurasi untuk estimasi jumlah baris cepat

Parameter

Deskripsi

Versi Didukung

Nilai Default

Catatan / Contoh Penggunaan

hg_experimental_get_fast_num_of_rows

Apakah akan mengaktifkan estimasi jumlah baris cepat.

v3.1 dan setelahnya

off (V3.1) on (V3.2+)

hg_experimental_enable_foreign_table_get_fast_num_of_rows

Apakah akan mengaktifkan estimasi jumlah baris tabel eksternal.

v3.1 dan setelahnya

off (V4.1.15 dan sebelumnya) on (V4.1.16+)

-- Cara mengaktifkan: ALTER DATABASE dbname SET hg_experimental_enable_foreign_table_get_fast_num_of_rows = on;

hg_experimental_fast_num_rows_foreign_partitions_access_limit

Untuk tabel partisi eksternal, jumlah maksimum partisi dari mana jumlah baris diperoleh sebagai dasar estimasi keseluruhan. Catatan: Ini hanya berlaku ketika estimasi jumlah baris tabel eksternal diaktifkan.

v3.1 dan setelahnya

60

Ini untuk mengontrol overhead waktu estimasi jumlah baris cepat.

hg_get_fast_num_of_rows_holo_partitions_access_limit

Untuk tabel partisi fisik Hologres, jumlah maksimum partisi dari mana jumlah baris diperoleh sebagai dasar estimasi keseluruhan.

v3.1 dan setelahnya

60

Ini untuk mengontrol overhead waktu estimasi jumlah baris cepat.

Menampilkan catatan eksekusi historis ANALYZE dan AUTO ANALYZE

Setelah ANALYZE dan AUTO ANALYZE dijalankan, catatan eksekusinya ditulis ke Query Log. Pengguna dapat melihat catatan eksekusi historis ANALYZE dan AUTO ANALYZE melalui tampilan hologres.hg_query_log, termasuk informasi seperti SQL yang dieksekusi, durasi, dan status.

Cara mengidentifikasi catatan ANALYZE dan AUTO ANALYZE di query log

ANALYZE dan AUTO ANALYZE, beserta pernyataan SQL sampling-nya, dicatat secara terpisah di Query Log.

Catatan eksekusi memiliki karakteristik berikut di Query Log:

Field

ANALYZE

AUTO ANALYZE

Deskripsi

usename

Username yang menjalankan ANALYZE

system

AUTO ANALYZE menggunakan akun sistem internal untuk eksekusi, yang secara seragam ditampilkan sebagai system di Query Log

application_name

Nama aplikasi sesi yang menjalankan ANALYZE

AutoAnalyze

Koneksi framework AUTO ANALYZE menggunakan AutoAnalyze sebagai application_name

application_name dari sub-SQL sampling

Hologres SQL Generated BY ANALYZE

Hologres SQL Generated BY AUTO ANALYZE

command_tag

ANALYZE

ANALYZE

Jenis perintah yang dieksekusi

command_tag dari sub-SQL sampling

SELECT

SELECT

Sub-SQL sampling adalah pernyataan SELECT. Anda dapat menggunakan pernyataan ini untuk memeriksa konsumsi sumber daya sampling.

ANALYZE dan SQL sampling-nya dikaitkan melalui komentar di field query, atau melalui extended_info->>'source_query_id'.

SELECT query_id,
       extended_info->>'src_query_id' as "source query id",
       application_name,
       status,
       duration
FROM   hologres.hg_query_log
WHERE  query_start >= now() - interval '1 hour'
  AND  application_name IN ('AutoAnalyze', 'Hologres SQL Generated BY AUTO ANALYZE')
ORDER BY query_start DESC
LIMIT  2;
      query_id       |   source query id   |            application_name            | status  | duration
---------------------+---------------------+----------------------------------------+---------+----------
 1004019226350863009 | 1004019226350778807 | Hologres SQL Generated BY AUTO ANALYZE | SUCCESS |      119
 1004019226350778807 |                     | AutoAnalyze                            | SUCCESS |     3276

Contoh kueri

  • Menampilkan catatan eksekusi AUTO ANALYZE terbaru

SELECT usename,
       status,
       duration,
       query_start,
       query_end,
       query,
       application_name
FROM   hologres.hg_query_log
WHERE  query_start >= now() - interval '1 hour'
  AND  application_name IN ('AutoAnalyze')
ORDER BY query_start DESC
LIMIT  20;

       query_id,
       extended_info->>'src_query_id' as "source query id"
  • Menampilkan riwayat eksekusi AUTO ANALYZE untuk tabel tertentu

SELECT status,
       duration,
       query_start,
       query
FROM   hologres.hg_query_log
WHERE  query_start >= now() - interval '1 day'
  AND  application_name IN ('AutoAnalyze')
  AND  query LIKE '%my_table_name%'
ORDER BY query_start DESC;
  • Merangkum ikhtisar eksekusi AUTO ANALYZE selama 3 hari terakhir

SELECT query_date,
       status,
       COUNT(*)          AS task_count,
       AVG(duration)     AS avg_duration_ms,
       MAX(duration)     AS max_duration_ms
FROM   hologres.hg_query_log
WHERE  query_start >= CURRENT_DATE::timestamptz - interval '2 day'
  AND  application_name IN ('AutoAnalyze')
  AND  command_tag = 'ANALYZE'
  AND  (status = 'SUCCESS' OR (
            message NOT LIKE '%does not exist%'
        AND message NOT LIKE '%retry later%'))
GROUP BY query_date, status
ORDER BY query_date DESC;
  • Menampilkan tugas AUTO ANALYZE yang gagal dalam sehari terakhir

SELECT query_start,
       duration,
       message,
       query
FROM   hologres.hg_query_log
WHERE  query_start >= now() - interval '1 day'
  AND  application_name IN ('AutoAnalyze', 'Hologres SQL Generated BY AUTO ANALYZE')
  AND  status != 'SUCCESS'
  AND  (message NOT LIKE '%does not exist%'
        AND message NOT LIKE '%retry later%')
ORDER BY query_start DESC;

Catatan

  • Karena koneksi AUTO ANALYZE dimulai dengan identitas administrator internal, pengguna biasa memerlukan peran pg_read_all_stats atau hak istimewa administrator database untuk melihat catatan eksekusi AUTO ANALYZE lengkap.

  • Jika Anda menemukan bahwa tidak ada catatan AUTO ANALYZE di Query Log untuk jangka waktu yang lama, disarankan untuk memeriksa apakah sakelar AUTO ANALYZE diaktifkan.

Menampilkan dan troubleshooting statistik

Menampilkan statistik tabel (hologres_statistic.hg_table_statistic)

Statistik tabel disimpan di tabel hologres_statistic.hg_table_statistic dan juga dapat diamati di tabel sistem.

  1. Kueri tabel ini untuk mendapatkan statistik dari ANALYZE terbaru.

SELECT schema_name,                -- Skema tabel
       table_name,                 -- Nama tabel
       user_name,                  -- Pengguna yang terakhir menjalankan ANALYZE
       schema_version,             -- Versi skema tabel pada ANALYZE terakhir
       total_rows,                 -- Jumlah baris pada ANALYZE terakhir
       sample_rows,                -- Baris sampel yang digunakan pada ANALYZE terakhir
       analyze_timestamp,          -- Waktu penyelesaian ANALYZE terakhir
       analyze_count               -- Total jumlah ANALYZE sejauh ini
FROM   hologres_statistic.hg_table_statistic
WHERE  unique_name = hologres.hg_internal_statistic_unique_name ('schemaname', 'tablename')
ORDER BY analyze_timestamp DESC;

-- Output contoh
 schema_name | table_name |    user_name     | schema_version | total_rows | sample_rows |  analyze_timestamp  | analyze_count
-------------+------------+------------------+----------------+------------+-------------+---------------------+---------------
 public      | test_fnr   |   BASIC$test_fnr |             -1 |        999 |         999 | 2026-03-02 22:05:29 |             2
(1 row)

V3.1 dan sebelumnya:

  • Setiap tabel memiliki 0 hingga n catatan di tabel hologres_statistic.hg_table_statistic. 0 catatan berarti ANALYZE belum pernah dilakukan, dan 1 atau lebih catatan berarti ANALYZE telah dijalankan.

  • Jika terdapat dua catatan atau lebih, schema_version kedua catatan tersebut harus berbeda, karena perubahan skema tabel (seperti ADD_COLUMN, CALL SET_TABLE_PROPERTY, dll.) menghasilkan versi baru, yang menambahkan catatan statistik baru. Catatan yang sesuai dengan schema_version lama tidak lagi digunakan.

  • Hasil kueri contoh berikut menunjukkan bahwa tabel yang sama memiliki 2 catatan, dan schema_version catatan kedua lebih rendah daripada yang pertama. Catatan kedua karena itu tidak valid dan tidak akan digunakan, dan Anda tidak perlu memperhatikannya. Hologres saat ini tidak membersihkan catatan kadaluarsa historis di tabel hg_table_statistic, dan pengguna tidak perlu khawatir tentang data lama.

 schema_name | table_name |    user_name     | schema_version | total_rows | sample_rows |  analyze_timestamp  | analyze_count
-------------+------------+------------------+----------------+------------+-------------+---------------------+---------------
 public      | test_fnr   |   BASIC$test_fnr |             13 |        999 |         999 | 2026-03-01 18:05:29 |             2
 public      | test_fnr   |   BASIC$test_fnr |             12 |        999 |         999 | 2026-03-01 08:05:29 |             1
(1 row)

V3.1 dan setelahnya:

  • Setiap tabel memiliki 0 hingga 1 catatan di tabel hologres_statistic.hg_table_statistic. 0 catatan berarti ANALYZE belum pernah dilakukan, dan 1 catatan berarti ANALYZE telah dijalankan.

  • schema_version secara seragam diatur ke -1 (mewakili Deprecated).

  • Artinya, banyak operasi DDL tidak lagi membatalkan statistik. Misalnya, CALL SET_TABLE_PROPERTY tidak akan memicu kembali AUTO ANALYZE, dan statistik yang ada akan terus digunakan. Dibandingkan dengan Hologres V3.0 dan versi sebelumnya, frekuensi pemicu AUTO ANALYZE berkurang secara signifikan.

  1. Menanyakan jumlah baris dan statistik lainnya

Informasi jumlah baris dicatat di field reltuples tabel pg_class.

-- relallvisible > 0: tabel memiliki statistik jumlah baris
-- relallvisible = 0: jumlah baris tidak diketahui; jangan mengandalkan reltuples
-- relallvisible < 0: tabel tidak memiliki statistik
SELECT relallvisible, reltuples FROM pg_class WHERE relname = 'test_table';

Jika tabel tidak memiliki statistik, lihat bagian "Menampilkan tabel dengan statistik yang hilang" di bawah untuk mengidentifikasi penyebabnya.

  1. Menanyakan statistik kolom

Dengan menanyakan tampilan pg_stats, Anda dapat memperoleh statistik untuk semua kolom tabel saat ini. Misalnya, untuk mendapatkan statistik untuk kolom ds dari test_table:

select * from pg_stats where tablename = 'test_table' and attname = 'ds';

 schemaname | tablename  | attname | inherited | null_frac | avg_width | n_distinct | most_common_vals | most_common_freqs | histogram_bounds | correlation | most_common_elems | most_common_elem_freqs | elem_count_histogram
------------+------------+---------+-----------+-----------+-----------+------------+------------------+-------------------+------------------+-------------+-------------------+------------------------+----------------------
 public     | test_table | ds      | f         |         0 |         4 |          1 | {20241104}       | {1}               |                  |             |                   |                        |
(1 row)

Jika kolom tidak memiliki statistik, lihat bagian "Menampilkan tabel dengan statistik yang hilang" di bawah untuk mengidentifikasi penyebabnya.

Menampilkan tabel dengan statistik yang hilang

Hologres menyediakan tampilan HG_STATS_MISSING (nama tampilan sebenarnya mungkin berbeda tergantung versi) untuk memeriksa tabel di database saat ini yang kehilangan statistik, sehingga memudahkan mengidentifikasi objek yang memerlukan ANALYZE tambahan.

Untuk field spesifik dan metode penggunaan, lihat dokumentasi instans yang sesuai atau bantuan konsol.

Masalah umum dan troubleshooting

  1. Kemungkinan alasan untuk 0 catatan yang dikembalikan dari tabel hologres_statistic.hg_table_statistic:

  • ANALYZE belum pernah dijalankan (baik secara manual maupun oleh AUTO ANALYZE);

  • AUTO ANALYZE tidak berfungsi, atau tabel belum memenuhi kondisi pemicu;

Tindakan yang disarankan:

  • Pertama, jalankan secara manual:

ANALYZE schema_name.table_name;
  • Jika tabel masih tidak dapat dicakup oleh AUTO ANALYZE untuk jangka waktu yang lama, disarankan untuk memeriksa sakelar AUTO ANALYZE dan konfigurasi GUC, atau menghubungi dukungan teknis.

  1. Kemungkinan alasan untuk analyze_timestamp yang jelas usang:

  • AUTO ANALYZE telah dinonaktifkan atau dibatasi (seperti autovacuum_enabled = false);

  • AUTO ANALYZE memiliki sumber daya yang tidak mencukupi atau gagal (dapat diselidiki bersamaan dengan log/pemantauan);

Tindakan yang disarankan:

  • Jalankan ANALYZE secara manual sekali dan amati hasilnya;

  • Periksa:

    • Apakah hg_enable_start_auto_analyze_worker diaktifkan;

    • Apakah autovacuum_enabled = false telah diatur secara keliru atau batasan GUC terkait terlalu ketat;

    • Periksa apakah terdapat error terkait tugas AUTO ANALYZE di Query Log.

  1. Estimasi jumlah baris abnormal dalam rencana kueri (terlalu kecil atau terlalu besar secara signifikan)

  • Periksa apakah tabel yang sesuai kehilangan statistik atau memiliki statistik yang usang;

  • Periksa apakah kolom predikat memiliki statistik (pg_stats), dan lakukan ANALYZE tingkat kolom pada kolom kritis;

  • Periksa apakah fitur estimasi jumlah baris cepat telah dinonaktifkan atau belum diaktifkan.

  1. Statistik induk-anak tidak konsisten untuk tabel partisi atau statistik yang hilang pada tabel induk

  • Gejala: Tabel partisi induk tidak memiliki catatan di hologres_statistic.hg_table_statistic, atau total_rows jauh lebih kecil daripada jumlah semua jumlah baris tabel anak, atau distribusi MCV kolom partisi tabel induk sudah usang (misalnya, kolom ds di pg_stats kehilangan distribusi kemarin);

  • Poin troubleshooting:

    • Periksa apakah ANALYZE partisi inkremental / AUTO ANALYZE telah dinonaktifkan;

SHOW hg_experimental_enable_incremental_analyze;
SHOW hg_experimental_enable_incremental_auto_analyze;
  • Gunakan tampilan HG_STATS_MISSING untuk memeriksa apakah terdapat tabel anak yang tidak dapat digabung;

  • Periksa apakah terdapat error terkait tugas AUTO ANALYZE di Query Log;

  • Jalankan secara manual ANALYZE child_table; pada tabel anak dengan statistik yang hilang, atau jalankan ANALYZE partition_parent_table; pada tabel induk selama jam sepi untuk membiarkan sistem mengisi dan menggabungkan statistik.

  1. Kolom tertentu tidak memiliki statistik di pg_stats

  • Gejala: Tabel memiliki kolom tersebut, tetapi statistik kolom yang sesuai tidak dapat ditemukan di tampilan pg_stats.

  • Poin troubleshooting:

    • Periksa apakah statistik telah dinonaktifkan melalui atribut kolom (enable_analyze = false atau enable_auto_analyze = false);

SELECT attoptions
  FROM pg_attribute
 WHERE attrelid = 'tablename'::regclass::oid
   AND attname = 'columnname';
-[ RECORD 1 ]----------------------
attoptions | {enable_analyze=false}
  • Konfirmasi apakah kolom telah berpartisipasi dalam ANALYZE (manual atau AUTO ANALYZE). Jika perlu, jalankan ANALYZE table_name(col_name); tingkat kolom;

SELECT query_id,
       application_name,
       status,
       query_start,
       query
FROM   hologres.hg_query_log
WHERE  query_start >= now() - interval '1 hour'
  AND  application_name IN ('Hologres SQL Generated BY ANALYZE', 'Hologres SQL Generated BY AUTO ANALYZE')
  AND  query like '%tablename%'
ORDER BY query_start DESC
LIMIT  2;
  • Apakah kolom tersebut merupakan tipe khusus (bytea, jsonb).

  • Jika tabel telah menjalankan AUTO ANALYZE tetapi tidak ada kolom yang memiliki statistik, pertimbangkan apakah tugas AUTO ANALYZE dijalankan secara abnormal. Misalnya, periksa apakah AUTO ANALYZE mengalami timeout. Karena auto_analyze_work_statement_timeout default-nya 1 jam, jika tugas AUTO ANALYZE di hologres.hg_query_log memiliki durasi >= 3600000, dalam kasus ini, hanya informasi jumlah baris yang dikumpulkan tanpa statistik kolom.

  1. AUTO ANALYZE telah dijalankan tetapi rencana kueri tidak membaik secara signifikan

  • Gejala: Catatan AUTO ANALYZE untuk tabel tertentu dapat dilihat di hologres.hg_query_log, tetapi rencana kueri aktual masih menggunakan estimasi jumlah baris yang jelas tidak masuk akal atau urutan Join;

  • Poin troubleshooting:

    • Periksa apakah AUTO ANALYZE mengalami timeout. Karena auto_analyze_work_statement_timeout default-nya 1 jam, jika tugas AUTO ANALYZE di hologres.hg_query_log memiliki durasi >= 3600s, dalam kasus ini, hanya informasi jumlah baris yang dikumpulkan tanpa statistik kolom.

    • Periksa apakah terdapat Hint, urutan Join tetap, atau GUC tingkat sesi lama (seperti enable_nestloop, dll.) yang mengganggu pilihan pengoptimal;

    • Lakukan ANALYZE manual pada tabel/kolom kritis dan kemudian jalankan kembali kueri. Jika masih tidak ada perbaikan, disarankan untuk menyelidiki lebih lanjut bersamaan dengan Query Log, log FE, atau dengan melaporkan ke dukungan teknis.

  1. Masalah OOM / melebihi batas memori yang disebabkan oleh statistik

  • Gejala: Join multi-tabel kompleks melaporkan error Query executor exceeded total memory limitation ..., atau rencana memilih strategi Join yang sangat tidak masuk akal (seperti Nested Loop tabel besar menggerakkan tabel besar, dll.);

  • Poin troubleshooting:

    • Konfirmasi apakah tabel terkait kehilangan statistik atau memiliki statistik yang sangat usang (dengan menggabungkan catatan di hg_table_statistic dan catatan eksekusi AUTO ANALYZE);

    • Lakukan ANALYZE tingkat kolom pada kolom Join dan kolom filter. Jika perlu, tingkatkan presisi sampling atau aktifkan fitur estimasi jumlah baris cepat;

    • Jika masalah hanya terjadi dalam skenario distribusi data ekstrem atau puncak tertentu, konsultasikan dengan dukungan teknis untuk mengevaluasi apakah diperlukan penyesuaian model statistik atau GUC terkait (seperti ambang batas AUTO ANALYZE, batas memori, dll.).

Menjalankan ANALYZE dan AUTO ANALYZE dengan Serverless

Mulai dari Hologres V3.1, di instans Serverless atau instans dengan sumber daya komputasi Serverless yang diaktifkan, ANALYZE dan AUTO ANALYZE dapat dijalankan pada sumber daya Serverless untuk mengurangi tekanan CPU/memori pada instans itu sendiri.

Bagian ini menjelaskan perilaku khas dan konfigurasi yang direkomendasikan untuk ANALYZE manual dan AUTO ANALYZE dalam skenario Komputasi Serverless, bersamaan dengan GUC terkait.

ANALYZE manual dan komputasi Serverless

  • hg_serverless_computing_enable_analyze_statement

    • Deskripsi: Mengontrol apakah pernyataan ANALYZE manual dapat dijalankan melalui tugas Serverless;

    • Perilaku:

      • Ketika diatur ke on (default), sistem mengizinkan pernyataan ANALYZE dialihkan ke sumber daya komputasi Serverless untuk eksekusi, meminimalkan dampak tugas statistik pada instans itu sendiri;

      • Ketika diatur ke off, ANALYZE dijalankan pada sumber daya instans lokal.

    • Rekomendasi khas:

      • Di instans Serverless, default-nya adalah on, hanya mengizinkan sumber daya Serverless menyelesaikan tugas statistik;

      • Ketika troubleshooting atau ketika ada persyaratan khusus untuk penggunaan sumber daya, Anda dapat sementara mengaturnya ke off untuk secara eksplisit menjalankan ANALYZE pada sumber daya lokal.

AUTO ANALYZE dan komputasi Serverless

Ketika menghasilkan tugas AUTO ANALYZE, sistem menentukan apakah akan menggunakan sumber daya Serverless dan bagaimana mengontrol perilaku tugas Serverless berdasarkan GUC berikut:

  • hg_auto_analyze_run_with_serverless_computing

    • Deskripsi: Apakah tugas AUTO ANALYZE dijalankan melalui sumber daya komputasi Serverless. Default-nya adalah off untuk instans reguler dan on untuk instans Serverless.

    • Perilaku:

      • Ketika diatur ke on, tugas AUTO ANALYZE akan mengirim komputasi sampling ke kolam sumber daya Serverless;

      • Ketika diatur ke off, AUTO ANALYZE terus menyelesaikan statistik melalui sumber daya instans lokal.

-- Atur pada tingkat database
ALTER DATABASE datname SET hg_auto_analyze_run_with_serverless_computing = on;
  • hg_auto_analyze_serverless_computing_query_priority

    • Deskripsi: Prioritas tugas AUTO ANALYZE Serverless, berkisar dari 1~5. Nilai lebih tinggi menunjukkan prioritas lebih tinggi. Default-nya adalah 2;

    • Perilaku:

      • Ketika AUTO ANALYZE Serverless diaktifkan, sistem mengatur prioritas yang sesuai untuk setiap tugas statistik melalui SET hg_experimental_serverless_tasks_query_priority = <value>;;

      • Ini berlaku ketika berbagi kolam sumber daya dengan tugas Serverless lain (seperti ETL dan kueri offline) untuk mengontrol kemampuan preemption tugas statistik dalam antrian keseluruhan;

    • Rekomendasi:

      • Di lingkungan produksi, biasanya dipertahankan pada prioritas menengah (seperti default 2 atau ditingkatkan secara moderat ke 3) untuk menghindari persaingan terlalu banyak sumber daya dengan pekerjaan bisnis inti;

      • Untuk skenario dengan persyaratan sangat tinggi untuk ketepatan waktu statistik dan sumber daya Serverless yang cukup, prioritas dapat ditingkatkan secara tepat.

  • hg_auto_analyze_serverless_computing_enable_persisted_snapshot

    • Deskripsi: Apakah akan menggunakan snapshot yang dipertahankan (persisted snapshot) dalam tugas AUTO ANALYZE Serverless, yaitu mengontrol apakah akan melewati flush tambahan melalui SET hg_experimental_enable_persisted_snapshot = on/off;;

    • Default-nya adalah off untuk instans non-Serverless dan on untuk instans Serverless.

    • Perilaku:

      • Ketika diatur ke on, tugas statistik akan mencoba menggunakan kembali snapshot yang dipertahankan, mengurangi kebutuhan untuk memicu flush. Ini lebih cocok untuk statistik frekuensi tinggi atau skenario dengan banyak tabel partisi;

      • Ketika diatur ke off, tugas statistik akan mencoba menggunakan snapshot yang lebih mutakhir, yang cocok untuk skenario dengan persyaratan konsistensi yang lebih tinggi atau isolasi versi tertentu.

    • Rekomendasi:

      • Jangan sesuaikan kecuali diperlukan.

Rekomendasi penggunaan untuk skenario komputasi Serverless

  1. Utamakan menggunakan Komputasi Serverless untuk menangani tugas ANALYZE berat

    • Ketika melakukan ANALYZE pada tabel atau tabel eksternal dengan volume data sangat besar, disarankan untuk mengaktifkan:

      • ANALYZE manual: set hg_computing_resource = 'serverless'; ANALYZE my_table;;

      • AUTO ANALYZE: ALTER DATABASE mydb SET hg_auto_analyze_run_with_serverless_computing = on;;

    • Hal ini memindahkan tekanan komputasi statistik ke kolam sumber daya Serverless, mengurangi gangguan terhadap kueri online pada instans.

  2. Atur prioritas tugas AUTO ANALYZE Serverless berdasarkan pentingnya bisnis

    • Di instans Serverless, untuk database bisnis kritis yang sensitif terhadap ketepatan waktu statistik dan bergantung pada statistik terbaru, Anda dapat secara tepat meningkatkan hg_auto_analyze_serverless_computing_query_priority;

    • Di instans reguler, menggunakan sumber daya lokal untuk AUTO ANALYZE biasanya sudah cukup.

  3. Ikuti prinsip "percobaan langkah kecil" sebelum menyesuaikan parameter

    • GUC terkait Komputasi Serverless juga merupakan parameter lanjutan. Sebelum melakukan penyesuaian, disarankan untuk terlebih dahulu memverifikasi di lingkungan uji atau staging:

      • Amati antrian dan durasi eksekusi tugas statistik di kolam sumber daya Serverless;

      • Pantau dampak terhadap latensi dan penggunaan sumber daya kueri bisnis inti;

    • Setelah memastikan tidak ada efek samping signifikan, terapkan ke lingkungan produksi berdasarkan database atau secara bertahap.