All Products
Search
Document Center

Hologres:Tingkatkan kinerja tulis

Last Updated:Jul 28, 2026

Jika kinerja operasi INSERT atau UPDATE tidak sesuai ekspektasi, mulailah dengan memeriksa metrik CPU Usage di Konsol Hologres. Penggunaan CPU rendah menunjukkan adanya bottleneck di hulu (pembacaan data lambat), sedangkan penggunaan CPU tinggi yang konsisten mencapai 100% mengindikasikan bahwa Hologres itu sendiri menjadi bottleneck. Topik ini memandu Anda mendiagnosis dan mengatasi kedua skenario tersebut.

Cara kerja

Setiap pernyataan SQL di Hologres mengikuti salah satu dari dua jalur eksekusi:

  • Jalur standar (HQE/PQE) — Melewati query optimizer (QO) dan query engine (QE). Operasi tulis memperoleh table lock, sehingga pernyataan INSERT, UPDATE, dan DELETE konkuren harus saling menunggu, menyebabkan latensi tinggi di bawah beban. HQE (Hologres Query Engine) menangani sebagian besar operasi tulis; PQE (PostgreSQL Query Engine) menangani skenario kompatibilitas.

  • Jalur Fixed Plan (FixedQE) — Melewati QO dan QE untuk operasi tulis titik sederhana. Menggunakan row locks alih-alih table locks, yang secara signifikan meningkatkan konkurensi dan throughput tulis.

sql执行流程

Memahami perbedaan ini menjelaskan sebagian besar masalah kinerja tulis — dan mengapa mengaktifkan Fixed Plan merupakan optimasi dengan dampak tertinggi.

Baseline kinerja

Sebelum melakukan tuning, ketahui batas maksimum kinerja berdasarkan konfigurasi tabel Anda.

Berdasarkan format penyimpanan (tulis/pembaruan kolom penuh):

Row-oriented > Column-oriented > Row-column hybrid

Berdasarkan format penyimpanan (tulis/pembaruan sebagian kolom):

Row-oriented > Row-column hybrid > Column-oriented

Berdasarkan mode tulis untuk tabel berorientasi kolom:

Kinerja tertinggi tercapai saat tabel sink tidak memiliki primary key. Jika tabel sink memiliki primary key, peringkat kinerjanya sebagai berikut:

InsertOrIgnore > InsertOrReplace >= InsertOrUpdate (full) > InsertOrUpdate (partial)

Berdasarkan mode tulis untuk tabel berorientasi baris:

InsertOrReplace = InsertOrUpdate (full) >= InsertOrUpdate (partial) >= InsertOrIgnore

Untuk tabel yang diaktifkan Binlog:

Row-oriented > Row-column hybrid > Column-oriented

Mode tulis

Write mode

Behavior

Primary key required

Insert

Hanya menambahkan. Tidak dilakukan pemeriksaan baris duplikat.

No

InsertOrIgnore

Jika terjadi konflik primary key, catatan masuk dibuang.

Yes

InsertOrReplace

Jika terjadi konflik primary key, baris yang ada diganti. Kolom yang tidak termasuk dalam operasi tulis diatur ke NULL.

Yes

InsertOrUpdate

Jika terjadi konflik primary key, hanya kolom yang ditentukan yang diperbarui. Kolom yang tidak termasuk dalam operasi tulis mempertahankan nilai yang sudah ada.

Yes

Memilih mode tulis:

  • Gunakan Insert untuk pipeline hanya-menambahkan tanpa primary key.

  • Gunakan InsertOrIgnore saat deduplikasi ditangani di hulu dan Anda menginginkan throughput tulis tertinggi pada tabel dengan primary key.

  • Gunakan InsertOrReplace saat Anda membutuhkan penggantian seluruh baris dan pengisian NULL untuk kolom yang tidak ada dapat diterima.

  • Gunakan InsertOrUpdate untuk pembaruan sebagian kolom — dengan menerima trade-off kinerja, karena mesin harus mencari baris yang ada sebelum menulis.

Identifikasi bottleneck

Periksa penggunaan CPU di Konsol Hologres:

CPU usage

Interpretation

Next step

Rendah

Sumber daya Hologres tidak dimanfaatkan optimal. Bottleneck berada di hulu.

Periksa kemungkinan pembacaan data lambat di sumber hulu Anda.

Tinggi (konsisten mendekati 100%)

Hologres telah mencapai bottleneck sumber daya.

Terapkan metode tuning dalam topik ini.

Jika kueri dan operasi tulis dijalankan secara konkuren, kueri dapat mendorong penggunaan CPU tinggi dan memengaruhi kinerja tulis. Periksa log kueri lambat untuk melihat apakah kueri konkuren mengonsumsi sumber daya. Jika iya, pertimbangkan untuk mengonfigurasi deployment high availability (HA) dengan read/write splitting.

Setelah mencoba semua metode tuning, jika kinerja tulis masih belum memenuhi kebutuhan Anda, lakukan scaling instans Hologres.

Aktifkan Fixed Plan

Fixed Plan adalah optimasi tunggal paling berdampak untuk kinerja tulis. Aktifkan sebelum mencoba hal lainnya.

Periksa apakah operasi tulis menggunakan Fixed Plan

Di Konsol Hologres, periksa metrik RPS berikut:

  • QE DML RPS — operasi tulis yang melewati jalur standar HQE/PQE (table locks, latensi lebih tinggi).

  • FixedQE DML RPS — operasi tulis yang menggunakan Fixed Plan (row locks, konkurensi tinggi).

Untuk menemukan operasi tulis yang tidak menggunakan Fixed Plan, kueri log kueri lambat:

-- Temukan operasi INSERT, UPDATE, dan DELETE yang tidak menggunakan Fixed Plan dalam 3 jam terakhir
SELECT *
FROM hologres.hg_query_log
WHERE query_start >= now() - interval '3 h'
  AND command_tag IN ('INSERT', 'UPDATE', 'DELETE')
  AND ARRAY['HQE'] && engine_type
ORDER BY query_start DESC
LIMIT 500;

Skenario di mana Fixed Plan tidak digunakan

Pernyataan SQL yang memenuhi salah satu kondisi berikut akan kembali ke jalur HQE:

  • Sintaksis multi-baris INSERT ON CONFLICT:

    INSERT INTO test_upsert(pk1, pk2, col1, col2)
        VALUES (1, 2, 5, 6), (2, 3, 7, 8)
    ON CONFLICT (pk1, pk2)
        DO UPDATE SET col1 = excluded.col1, col2 = excluded.col2;
  • INSERT ON CONFLICT untuk pembaruan parsial di mana kolom tabel Hologres tidak sesuai dengan kolom data yang dimasukkan.

  • Tabel Hologres berisi kolom bertipe SERIAL.

  • Tabel Hologres memiliki properti Default yang diatur.

  • UPDATE atau DELETE berdasarkan primary key (contoh: UPDATE table SET col1 = ?, col2 = ? WHERE pk1 = ? AND pk2 = ?).

  • Tipe data yang tidak didukung oleh Fixed Plan.

Aktifkan Fixed Plan untuk skenario ini

Gunakan parameter GUC untuk memperluas cakupan Fixed Plan. Atur parameter ini di level database:

Scenario

GUC parameter

Notes

Multi-baris INSERT ON CONFLICT

ALTER DATABASE <databasename> SET hg_experimental_enable_fixed_dispatcher_for_multi_values = on;

Atur di level database.

Kolom bertipe SERIAL

ALTER DATABASE <databasename> SET hg_experimental_enable_fixed_dispatcher_autofill_series = on;

Default on di Hologres V1.3.25+. Hindari tipe SERIAL bila memungkinkan — tipe ini menurunkan kinerja tulis.

Kolom dengan properti Default

Tidak perlu GUC di Hologres V1.3+.

Di V1.3+, insert on conflict dengan kolom Default secara otomatis menggunakan Fixed Plan. Tidak didukung di V1.1. Hindari properti Default bila memungkinkan.

UPDATE berdasarkan primary key

ALTER DATABASE <databasename> SET hg_experimental_enable_fixed_dispatcher_for_update = on;

Default on di Hologres V1.3.25+.

DELETE berdasarkan primary key

ALTER DATABASE <databasename> SET hg_experimental_enable_fixed_dispatcher_for_delete = on;

Default on di Hologres V1.3.25+.

Untuk detail lebih lanjut, lihat Percepat eksekusi SQL dengan fixed plan.

Saat operasi tulis menggunakan Fixed Plan, operasi tersebut dihitung dalam metrik FixedQE DML RPS, dan kolom engine_type di log kueri lambat menampilkan FixedQE.

Catatan

Sebelum Hologres V2.2, operasi tulis Fixed Plan melaporkan engine_type sebagai SDK, dan konsol melacak semua operasi DML dalam satu metrik RPS gabungan. Mulai Hologres V2.2, engine_type adalah FixedQE, dan metrik dipisah menjadi QE DML RPS dan FixedQE DML RPS. Untuk definisi metrik, lihat Metrik pemantauan.

Fixed Plan diaktifkan tetapi operasi tulis masih lambat

Jika operasi tulis sudah menggunakan Fixed Plan tetapi latensi tetap tinggi, penyebab paling umum adalah campuran operasi HQE dan FixedQE pada tabel yang sama. Operasi HQE memegang table lock, yang memblokir operasi FixedQE. Untuk memeriksa:

-- Temukan operasi HQE pada tabel tertentu dalam 3 jam terakhir
SELECT *
FROM hologres.hg_query_log
WHERE query_start >= now() - interval '3 h'
  AND command_tag IN ('INSERT', 'UPDATE', 'DELETE')
  AND ARRAY['HQE'] && engine_type
  AND table_write = '<table_name>'
ORDER BY query_start DESC
LIMIT 500;

Tulis ulang operasi HQE apa pun menjadi pernyataan yang kompatibel dengan FixedQE. Gunakan Get query insights di HoloWeb untuk dengan cepat mengidentifikasi apakah lock HQE memblokir operasi tulis Fixed Plan.

Jika semua operasi tulis sudah merupakan operasi FixedQE dan latensi tetap tinggi, periksa penggunaan CPU. CPU tinggi yang konsisten menunjukkan bottleneck sumber daya instans — pertimbangkan untuk melakukan scaling out.

Metode tuning dasar

Gunakan koneksi VPC

Gunakan koneksi Virtual Private Cloud (VPC) alih-alih jaringan publik. Jaringan publik memiliki batas trafik dan latensi lebih tinggi dibandingkan VPC. Hal ini terutama berlaku saat menghubungkan aplikasi melalui Java Database Connectivity (JDBC) atau psql.

Untuk jenis jaringan yang didukung Hologres dan panduan memilihnya, lihat Konfigurasi jaringan.

Hindari mengaktifkan Binlog pada tabel berorientasi kolom

Binlog mencatat setiap operasi INSERT, UPDATE, dan DELETE pada level baris lengkap. Untuk tabel berorientasi kolom, pencatatan perubahan baris lengkap memerlukan kueri titik untuk membaca seluruh baris — yang lebih intensif sumber daya dibandingkan tabel berorientasi baris. Jika Binlog diperlukan, gunakan tabel berorientasi baris.

Hindari operasi tulis real-time dan batch konkuren ke tabel yang sama

Operasi tulis batch (misalnya, MaxCompute ke Hologres) menggunakan table lock. Operasi tulis stream (misalnya, Flink atau DataWorks Data Integration) biasanya menggunakan row lock melalui Fixed Plan. Saat keduanya dijalankan secara konkuren terhadap tabel yang sama, table lock dari operasi batch memblokir semua operasi tulis real-time hingga dilepas. Pisahkan workload ini: jalankan operasi batch dalam jendela pemeliharaan, atau tulis ke tabel berbeda.

Gunakan INSERT OVERWRITE untuk mengganti data partisi

Saat Anda perlu mengganti atau menghapus semua data dalam suatu partisi, gunakan INSERT OVERWRITE alih-alih DELETE diikuti INSERT.

INSERT OVERWRITE adalah operasi tingkat metadata yang mengganti data partisi dengan menukar pointer file. Operasi ini dieksekusi dengan cepat dan tidak memicu logika dynamic pruning. Sebaliknya, pernyataan DELETE mengharuskan mesin memindai semua file data dalam partisi untuk menemukan dan menghapus baris, menyebabkan overhead I/O dan CPU signifikan. Kinerja tulis dengan kombinasi DELETE + INSERT jauh lebih rendah dibandingkan INSERT OVERWRITE.

Saat menggunakan tugas penjadwalan untuk menulis ke tabel partisi, gunakan parameter penjadwalan untuk menentukan partisi target secara langsung dalam pernyataan INSERT OVERWRITE. Hindari penggunaan subkueri untuk menentukan data mana yang harus dihapus dan dimasukkan kembali.

-- Direkomendasikan: gunakan INSERT OVERWRITE dengan parameter penjadwalan
INSERT OVERWRITE hologres_table PARTITION(ds='${bizdate}')
SELECT col1, col2, col3
FROM source_table
WHERE ds = '${bizdate}';

-- Tidak direkomendasikan: DELETE + INSERT
DELETE FROM hologres_table WHERE ds = '${bizdate}';
INSERT INTO hologres_table
SELECT col1, col2, col3
FROM source_table
WHERE ds = '${bizdate}';

Tuning operasi tulis Holo Client dan JDBC

Tulis dalam batch

Operasi tulis batch memberikan throughput jauh lebih tinggi dibandingkan tulis satu catatan.

  • Holo Client secara otomatis membuat batch data. Gunakan konfigurasi default.

  • JDBC — tambahkan reWriteBatchedInserts=true ke string koneksi:

    jdbc:postgresql://{ENDPOINT}:{PORT}/{DBNAME}?ApplicationName={APPLICATION_NAME}&reWriteBatchedInserts=true

Contoh berikut menunjukkan cara kerja batching:

-- Dua insert terpisah (throughput rendah)
INSERT INTO data_t VALUES (1, 2, 3);
INSERT INTO data_t VALUES (2, 3, 4);

-- Insert batch (throughput lebih tinggi)
INSERT INTO data_t VALUES (1, 2, 3), (4, 5, 6);

-- Alternatifnya, menggunakan unnest
INSERT INTO data_t
SELECT unnest(ARRAY[1, 4]::int[]), unnest(ARRAY[2, 5]::int[]), unnest(ARRAY[3, 6]::int[]);

Untuk detail lebih lanjut, lihat Holo Client dan JDBC.

Gunakan mode Prepared Statement

Hologres mendukung protokol extended PostgreSQL dan mode Prepared Statement. Ini menyimpan cache hasil kompilasi SQL di server, menghilangkan overhead parsing berulang dari frontend (FE) dan QO pada setiap operasi tulis — terutama bermanfaat untuk operasi tulis frekuensi tinggi.

Untuk cara mengaktifkan mode Prepared Statement dengan JDBC dan Holo Client, lihat JDBC.

Tuning operasi tulis Flink

Persyaratan tipe tabel

Tabel sumber Binlog:

  • Flink mendukung himpunan terbatas tipe data saat mengonsumsi Binlog Hologres. Jika tipe yang tidak didukung (seperti SMALLINT) ada dalam skema, job dapat gagal meskipun Anda tidak mengonsumsi field tersebut. Di Ververica Runtime (VVR) 6.0.3 dan versi lebih baru, gunakan mode JDBC untuk konsumsi Binlog — mode ini mendukung lebih banyak tipe data.

  • Gunakan tabel berorientasi baris untuk sumber yang diaktifkan Binlog. Mengaktifkan Binlog pada tabel berorientasi kolom mengonsumsi lebih banyak sumber daya dan mengurangi kinerja tulis.

Tabel dimensi:

  • Gunakan tabel berorientasi baris atau hybrid baris-kolom. Tabel berorientasi kolom memiliki overhead tinggi dalam skenario kueri titik.

  • Tetapkan primary key. Konfigurasikan primary key sebagai clustering key untuk kinerja lebih baik.

  • Primary key tabel dimensi harus persis sesuai dengan field yang digunakan dalam klausa JOIN ON Flink — keduanya harus identik.

Tabel sink:

  • Untuk penggabungan tabel lebar atau pembaruan parsial, tabel Hologres harus memiliki primary key. Setiap tabel sink harus mendeklarasikan dan menulis ke field primary key, menggunakan mode tulis InsertOrUpdate, dan mengatur ignoredelete = true untuk mencegah pesan retraction menghasilkan permintaan DELETE.

  • Untuk tabel berorientasi kolom dalam skenario penggabungan tabel lebar, nonaktifkan Dictionary Encoding untuk field tabel guna mengurangi penggunaan CPU pada catatan per detik (RPS) tinggi.

  • Tetapkan segment_key pada tabel yang memiliki primary key. Gunakan field timestamp atau tanggal yang memiliki korelasi kuat dengan waktu tulis — ini membantu mesin dengan cepat menemukan file data target selama operasi tulis dan pembaruan.

Konfigurasi konektor Flink yang direkomendasikan

Nilai default opsi konektor Hologres cocok untuk sebagian besar skenario. Sesuaikan saat Anda menghadapi masalah berikut:

Latensi tinggi dalam konsumsi Binlog:

Ukuran batch baca default (binlogBatchReadSize) adalah 100 baris. Jika ukuran baris individual kecil, tingkatkan nilai ini untuk mengurangi latensi konsumsi.

Kinerja kueri titik tabel dimensi buruk:

  • Atur async = true untuk mengaktifkan mode asinkron, yang memproses beberapa permintaan secara konkuren dan menghilangkan blocking antar permintaan berurutan. Perhatikan bahwa mode asinkron tidak menjamin urutan permintaan yang ketat.

  • Untuk tabel dimensi besar yang jarang diperbarui, aktifkan cache LRU: atur cache = 'LRU'. Ukuran cache default cacheSize adalah 10.000 baris (konservatif) — tingkatkan berdasarkan ukuran tabel aktual dan pola akses.

Kehabisan koneksi dengan banyak Pekerjaan Flink:

Gunakan parameter connectionPoolName. Tabel dengan nama pool koneksi yang sama dalam TaskManager yang sama berbagi koneksi.

Preferensi pengembangan job

Lebih disukai Flink SQL daripada DataStream untuk kemudahan pemeliharaan dan portabilitas:

Flink SQL > Flink DataStream (connector) > Flink DataStream (holo-client) > Flink DataStream (JDBC)

Untuk job DataStream, gunakan konektor Hologres DataStream atau Holo Client alih-alih JDBC mentah.

Diagnosis operasi tulis Flink lambat

Operasi tulis lambat di Flink dapat disebabkan oleh bottleneck di tahap awal job, bukan di sink Hologres. Periksa tekanan balik (backpressure) node. Jika backpressure muncul di node sumber atau komputasi, data yang tiba di sink Hologres sudah lambat — optimalkan langkah Flink hulu terlebih dahulu.

Jika penggunaan CPU Hologres konsisten mendekati 100% dan latensi tulis tinggi, bottleneck berada di sisi Hologres.

Untuk error Flink umum dan solusinya, lihat FAQ dan diagnostik Blink serta Flink.

Tuning operasi tulis DataWorks Data Integration

Pengaturan koneksi dan konkurensi

Dalam mode wizard, setiap thread konkuren menggunakan tiga koneksi. Dalam mode editor kode, konfigurasikan:

  • maxConnectionCount — total koneksi untuk tugas.

  • insertThreadCount — koneksi per thread konkuren.

Dalam sebagian besar kasus, pengaturan konkurensi dan koneksi default memberikan kinerja baik. Sesuaikan hanya saat Anda mengamati konflik sumber daya.

Ukuran kelompok sumber daya eksklusif

Sebagian besar job Data Integration memerlukan kelompok sumber daya eksklusif. Spesifikasi kelompok sumber daya menetapkan batas kinerja atas untuk tugas. Untuk throughput optimal, alokasikan satu thread konkuren per core CPU dalam kelompok sumber daya.

Jika kelompok sumber daya terlalu kecil relatif terhadap konkurensi tugas, Anda mungkin melihat error memori JVM. Jika bandwidth kelompok sumber daya jenuh, pecah tugas menjadi tugas-tugas lebih kecil dan distribusikan ke beberapa kelompok sumber daya. Untuk spesifikasi dan metrik kelompok sumber daya, lihat Metrik kinerja.

Diagnosis apakah bottleneck berada di hulu atau Hologres

  • Jika waktu tunggu sisi baca lebih lama daripada waktu tunggu sisi tulis, bottleneck berada di sumber data hulu.

  • Jika penggunaan CPU Hologres konsisten tinggi dan latensi tulis meningkat, bottleneck berada di sisi Hologres.

Operasi tulis DataX lambat dengan penggunaan CPU tinggi

Jika operasi tulis DataX lambat dan pemantauan instans Hologres menunjukkan bahwa penggunaan CPU tetap tinggi (misalnya, beberapa node pekerja mencapai 100%), saturasi sumber daya CPU menyebabkan permintaan tulis masuk mengantre atau mengalami penundaan pemrosesan.

Untuk mengatasi masalah ini:

  1. Periksa apakah operasi tulis menggunakan Fixed Plan. Di Konsol Hologres, periksa metrik RPS. Jika operasi tulis muncul di QE DML RPS (jalur HQE) alih-alih FixedQE DML RPS, berarti operasi tersebut tidak menggunakan Fixed Plan. Konfigurasikan parameter GUC atau tulis ulang pernyataan SQL untuk mengaktifkan Fixed Plan. Untuk detailnya, lihat bagian Aktifkan Fixed Plan dalam topik ini.

  2. Jika Fixed Plan sudah diaktifkan tetapi penggunaan CPU tetap konsisten tinggi, instans telah mencapai kapasitas sumber dayanya. Lakukan scaling instans Hologres untuk menambahkan lebih banyak sumber daya komputasi.

Tuning lanjutan

Metode ini mengatasi masalah kinerja yang disebabkan oleh distribusi data dan konfigurasi tabel. Terapkan setelah mengaktifkan Fixed Plan dan menggunakan metode tuning dasar.

Kesenjangan data

Saat data tidak merata (skewed) atau kunci distribusi diatur tidak tepat, sumber daya komputasi dalam instans Hologres menjadi tidak seimbang — beberapa shard melakukan jauh lebih banyak pekerjaan daripada yang lain. Untuk memeriksa dan mengatasi kesenjangan data, lihat Deteksi dan tangani kesenjangan beban kerja.

Kunci segmen tidak tepat

Kunci segmen mengontrol cara Hologres mempartisi data ke dalam file penyimpanan dasar. Selama operasi tulis dan pembaruan, Hologres menggunakan kunci segmen untuk menemukan baris yang ada. Jika kunci segmen tidak ada, diatur ke field yang tidak relevan, atau data dalam field kunci segmen tidak berkorelasi dengan waktu tulis (misalnya, datang tidak berurutan), setiap operasi tulis harus memindai banyak file — mengonsumsi I/O dan CPU berat bahkan saat workload didominasi operasi tulis.

Gejala: metrik throughput IO di konsol menunjukkan nilai baca tinggi selama workload yang didominasi operasi tulis.

Perbaikan: Gunakan field timestamp atau tanggal sebagai kunci segmen. Data dalam field ini harus memiliki korelasi kuat dengan waktu tulis — nilai yang datang kira-kira berurutan menghasilkan kinerja terbaik.

Kunci pengelompokan tidak tepat pada tabel berorientasi baris

Untuk tabel berorientasi baris dengan primary key, Hologres menggunakan indeks primary key dan indeks clustering key untuk mencari baris yang ada selama operasi tulis atau pembaruan. Jika clustering key berbeda dari primary key, setiap operasi tulis melakukan dua pencarian indeks alih-alih satu, meningkatkan latensi.

Pastikan clustering key dan primary key identik pada tabel berorientasi baris.

Pada tabel berorientasi kolom, clustering key memengaruhi kinerja kueri, bukan kinerja tulis. Tidak perlu perubahan untuk optimasi tulis.

Referensi