Setelah mengimpor volume data yang besar atau menjalankan banyak operasi DELETE atau UPDATE, fragmentasi file data dapat menurunkan performa baca dan tulis. Compaction menggabungkan file data kecil menjadi file yang lebih besar, memulihkan efisiensi penyimpanan, dan meningkatkan kecepatan kueri.
Cara kerja
Hologres menggunakan struktur data yang mirip dengan LSM-Tree (log-structured merge-tree) untuk penulisan data. Semua penulisan bersifat append-only, mengubah penulisan acak menjadi penulisan sekuensial guna memaksimalkan throughput tulis. Seiring waktu, hal ini menghasilkan banyak file kecil yang harus digabung melalui compaction.
Hologres mendukung dua jenis compaction:
-
Auto compaction: Compaction hirarkis dengan hingga lima level. Ketika suatu level mengumpulkan lebih dari lima file, compaction dipicu secara otomatis dan hasilnya dipindahkan ke level berikutnya. Misalnya, lima file di Level 0 digabung menjadi satu file (maksimal 64 MB secara default) yang dipindahkan ke Level 1. Auto Compaction hanya menggabungkan file dalam level yang sama—tidak pernah lintas level.
-
Full compaction: Menggabungkan semua file di seluruh level menjadi file baru (masing-masing 64 MB secara default) yang ditempatkan di level terakhir. Full compaction harus dipicu secara manual.

Kapan menjalankan full compaction
Auto compaction menangani penggabungan file rutin secara terus-menerus di latar belakang. Jalankan full compaction hanya ketika fragmentasi file telah menumpuk melebihi batas yang dapat ditangani oleh auto compaction secara inkremental—khususnya setelah salah satu situasi berikut:
-
Mengimpor volume besar data offline
-
Menjalankan banyak operasi
DELETEatauUPDATE
Full compaction adalah operasi administratif yang intensif sumber daya. Operasi ini mengonsumsi sumber daya I/O dan CPU yang signifikan. Eksekusi biasanya memakan waktu lebih dari 10 menit. Jalankan selama periode aktivitas tulis rendah untuk meminimalkan dampak terhadap workload Anda.
Jalankan full compaction
Prasyarat dan batasan
-
Full compaction memerlukan Hologres V2.1 atau versi yang lebih baru. Untuk upgrade, lihat Upgrade an instance atau minta dukungan online untuk mengajukan permintaan upgrade.
-
Hanya tabel berorientasi kolom dan tabel hybrid baris-kolom yang mendukung full compaction.
-
Untuk tabel hybrid baris-kolom, full compaction hanya berlaku pada bagian column store.
Sintaks
SELECT hologres.hg_full_compact_table(
'<schema_name.table_name>'
[,'max_file_size_mb=<value>']
);
Parameter
|
Parameter |
Description |
Required |
Default |
|
|
Nama tabel yang akan dikompaksi |
Yes |
— |
|
|
Ukuran maksimum dalam MB untuk setiap file output. Harus berupa bilangan bulat positif. Menetapkan nilai ini terlalu rendah akan menghasilkan terlalu banyak file kecil, yang memperlambat kueri. Jangan ubah nilai ini kecuali benar-benar diperlukan. |
No |
64 |
Contoh
Jalankan full compaction pada public.lineitem:
SELECT hologres.hg_full_compact_table('public.lineitem');
Jalankan full compaction pada public.lineitem dengan ukuran maksimum file output 256 MB:
SELECT hologres.hg_full_compact_table(
'public.lineitem',
'max_file_size_mb=256'
);
Tune auto compaction untuk satu tabel
Full compaction adalah operasi manual yang dilakukan sekali saja. Untuk mengubah cara kerja auto compaction pada satu tabel, atur properti tabel tersebut. Properti ini mengontrol konkurensi compaction, pemilihan file, dan frekuensi pemicuan. Gunakan properti ini untuk menjeda compaction selama proses bulk load, membersihkan file kecil yang menumpuk, atau mengurangi konflik sumber daya akibat compaction latar belakang.
Prasyarat dan batasan
-
Properti tabel ini memerlukan Hologres V4.0 atau versi yang lebih baru. Pada versi sebelumnya, pengaturan ini tidak berpengaruh. Lakukan upgrade instans terlebih dahulu.
-
Properti ini hanya berlaku untuk tabel berorientasi kolom dan tabel hybrid baris-kolom. Untuk tabel hybrid baris-kolom, properti ini hanya memengaruhi bagian column store. Mengaturnya pada tabel berorientasi baris tidak berpengaruh.
-
Auto compaction umumnya tidak memerlukan intervensi manual. Kecuali
online_config_compaction_semaphore, properti lanjutan berinteraksi dengan pengaturan konkurensi dengan cara yang sulit diprediksi. Ubah hanya untuk mengatasi masalah spesifik, sebaiknya dengan panduan dari dukungan teknis, dan kembalikan ke nilai default setelahnya.
Atur, kueri, dan reset properti tabel
Atur properti compaction tingkat tabel dengan SET_TABLE_PROPERTY. Setiap nama properti memiliki awalan online_config_, dan setiap nilai diberikan sebagai string. Nilai baru berlaku untuk tugas compaction yang dijadwalkan setelah perubahan; tugas yang sedang berjalan tidak terpengaruh. Anda tidak perlu restart instans atau rebuild tabel.
-- Sintaks
CALL SET_TABLE_PROPERTY('<schema_name>.<table_name>', 'online_config_<property_name>', '<value>');
-- Jeda penjadwalan compaction pada public.orders
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '0');
Reset properti
Atur properti ke reset untuk menghapus override tingkat tabel dan mengembalikan tabel ke nilai default instans.
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', 'reset');
Jika tabel tersebut sudah memiliki override yang dibutuhkan oleh workload Anda—misalnya, nilai 4 yang sengaja ditetapkan—masukkan kembali nilai tersebut alih-alih menggunakan reset. Catat status saat ini sebelum melakukan perubahan apa pun. Lihat Query the current settings.
Kueri pengaturan saat ini
SELECT property_key, property_value
FROM hologres.hg_table_properties
WHERE table_namespace = '<schema_name>'
AND table_name = '<table_name>'
AND property_key LIKE 'online_config_%';
Hasil kosong berarti tabel tidak memiliki override tingkat tabel dan mengikuti nilai default instans.
Kontrol konkurensi compaction
online_config_compaction_semaphore adalah properti utama yang perlu diatur. Properti ini membatasi jumlah tugas compaction konkuren per tablet, bukan per tabel—tablet adalah unit tempat compaction dijadwalkan. Satu tabel memiliki satu atau beberapa tablet pada setiap shard; pada tabel hybrid baris-kolom, bagian row store dan column store merupakan tablet terpisah. Batas teoretis untuk seluruh tabel karenanya kira-kira tablet_count × property_value, meskipun batas konkurensi tingkat worker dan sumber daya yang tersedia biasanya membatasinya lebih rendah.
|
Value |
Behavior |
When to use |
|
0 |
Menghentikan penjadwalan tugas compaction baru untuk tabel tersebut. |
Jendela sementara sebelum bulk load. Selalu kembalikan nilainya setelahnya. |
|
1 |
Mempertahankan kemampuan penggabungan minimum. |
Compaction jelas memengaruhi kueri online dan Anda perlu mengurangi beban. |
|
2 |
Default. |
Hampir semua workload. |
|
3 hingga 8 |
Meningkatkan throughput penggabungan. |
File terus menumpuk dan instans memiliki sumber daya cadangan. Naikkan nilai satu per satu. |
Apa yang sebenarnya terjadi saat nilai diatur ke 0
-
Tugas compaction baru untuk tabel tersebut tidak lagi dijadwalkan.
-
Tugas yang sedang berjalan tidak dibatalkan. Mereka selesai secara normal.
-
Tugas yang sudah dipilih untuk tabel ini dan sedang menunggu tetap mengambil slot konkurensi tingkat worker. Oleh karena itu, mengatur banyak tabel ke 0 sekaligus akan menghambat compaction pada tabel lain.
-
Setelah Anda menaikkan nilai di atas 0, tugas yang antre dilanjutkan, tetapi backlog yang belum pernah dijadwalkan tidak dijamin akan diproses sendiri—terutama jika tabel tidak menerima penulisan baru. Jalankan
VACUUMsekali untuk memaksa backlog diproses. Untuk informasi tentang apa yang dilakukan dan tidak dilakukan olehVACUUM, lihat Examples.
Untuk memulihkan konkurensi dan menggabungkan backlog:
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '2');
VACUUM public.orders;
Tabel partisi logis
Untuk tabel partisi logis, Hologres menaikkan konkurensi secara proporsional terhadap jumlah partisi aktif. Batas atas untuk satu unit penjadwalan adalah min(online_config_partition_table_compaction_semaphore_max, active_partition_count × online_config_compaction_semaphore), dibatasi hingga 8 secara default. active_partition_count diukur saat runtime dan bukan properti yang dapat Anda atur.
Risiko
-
Jangan biarkan nilai tetap 0 terlalu lama. Jumlah file dan baris yang dihapus terus menumpuk, performa kueri dan penggunaan penyimpanan keduanya menurun, dan semakin lama backlog tumbuh, semakin berat proses penggabungan akhirnya.
-
Jangan atur nilai 0 atau naikkan nilai untuk banyak tabel sekaligus. Semua tabel berbagi anggaran konkurensi tingkat worker: jeda massal memungkinkan tugas yang antre menghabiskan anggaran tersebut, dan peningkatan massal menyebabkan antrian global dan lonjakan sumber daya.
-
Ubah satu tabel dan satu properti dalam satu waktu, dengan kenaikan terkecil yang berguna, dan amati selama satu siklus bisnis penuh sebelum melakukan perubahan berikutnya.
Properti lanjutan
Properti berikut mengubah cara compaction memilih file dan seberapa sering dipicu. Properti ini berinteraksi dengan pengaturan konkurensi, sehingga ubah hanya untuk masalah spesifik yang telah didiagnosis—idealnya dengan panduan dari dukungan teknis—dan kembalikan ke nilai default setelahnya.
|
Property |
Default |
Description |
|
|
8 |
Batas atas konkurensi compaction untuk satu unit penjadwalan tabel partisi logis. Digabungkan dengan |
|
|
5 |
Jumlah maksimum file input yang dipilih oleh satu tugas compaction. |
|
|
5 |
Jumlah file kandidat yang diperlukan untuk memicu tugas compaction. Ambang batas efektif adalah nilai yang lebih kecil antara nilai ini dan |
|
|
256 |
Total ukuran dalam MB dari file yang dipilih oleh satu tugas compaction untuk tabel berorientasi kolom, atau bagian column store dari tabel hybrid baris-kolom. Secara tidak langsung menentukan ukuran output gabungan. |
|
|
512 |
Total volume data dalam MB yang dipilih oleh satu tugas compaction pada jalur data non-kolom. |
|
|
30 |
Persentase baris yang dihapus dalam suatu file di atas ambang batas yang menyebabkan file tersebut dikompaksi di tempat untuk membebaskan ruang. |
|
|
false |
Mengabaikan batas level selama pemilihan file, memungkinkan penggabungan lintas level. Gunakan untuk membersihkan file kecil ekor panjang yang tersebar beberapa per level dan tidak pernah mencapai ambang pemicu. |
|
|
true |
Apakah file di level terbawah ikut serta dalam compaction. |
Konkurensi compaction total tingkat worker—batas atas yang dibagi oleh semua tabel pada satu node pekerja—adalah pengaturan tingkat instans, bukan properti tabel, dan tidak dapat diubah dengan SET_TABLE_PROPERTY. Hubungi dukungan teknis jika Anda perlu menyesuaikannya.
Contoh
Contoh 2 dan 3 mengubah properti lanjutan. Jalankan dengan panduan dari dukungan teknis, dan kembalikan ke nilai default setelah masalah teratasi.
Contoh 1: Jeda compaction untuk bulk load
-- 1. Catat status saat ini. Hasil kosong berarti tidak ada override yang diatur.
SELECT property_key, property_value FROM hologres.hg_table_properties
WHERE table_namespace = 'public' AND table_name = 'orders'
AND property_key = 'online_config_compaction_semaphore';
-- 2. Hentikan penjadwalan tugas compaction baru.
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '0');
-- 3. Jalankan bulk load. Pantau CPU, I/O, dan throughput load selama proses berlangsung.
-- 4. Pulihkan properti. Pilih salah satu berikut berdasarkan langkah 1.
-- 4a. Langkah 1 tidak mengembalikan baris:
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', 'reset');
-- 4b. Langkah 1 mengembalikan nilai. Masukkan kembali nilai tersebut:
-- CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '<original_value>');
-- 5. Gabungkan backlog. Jalankan ini selama periode aktivitas tulis rendah.
VACUUM public.orders;
Contoh 2: Bersihkan file kecil ekor panjang
Gunakan ini ketika setiap level memiliki file lebih sedikit daripada ambang pemicu, namun tabel telah mengumpulkan puluhan file kecil yang tidak pernah digabung.
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_ignore_level_compaction', 'true');
VACUUM public.orders;
-- Kembalikan ke default setelah jumlah file turun. Membiarkannya aktif akan meningkatkan
-- frekuensi compaction serta penggunaan CPU dan I/O pada tabel yang terus ditulis.
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_ignore_level_compaction', 'reset');
Contoh 3: Hasilkan file gabungan yang lebih besar
Gunakan ini ketika satu tablet menyimpan volume data besar yang tersebar di banyak file.
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_orc_max_total_size_to_merge_mb', '512');
VACUUM public.orders;
-- Kembalikan ke default setelah jumlah file turun.
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_orc_max_total_size_to_merge_mb', 'reset');
Di Hologres, VACUUM <table_name> melakukan flush pada tabel dan menunggu tugas compaction-nya konvergen. Ini adalah cara untuk memicu auto compaction—berguna setelah menaikkan online_config_compaction_semaphore dari 0, atau setelah mengubah properti pemilihan—tetapi tidak setara dengan full compaction dan tidak memaksa penggabungan lintas level untuk semua file.
Verifikasi bahwa perubahan telah berlaku
-
Nama properti tidak divalidasi. Nama apa pun setelah awalan
online_config_diterima dan pernyataan berhasil. Nama yang salah ketik tidak cocok dengan konfigurasi apa pun, sehingga perubahan diam-diam tidak berpengaruh. Untuk mencegah hal ini:-
Salin nama properti dari tabel dalam topik ini alih-alih mengetiknya.
-
Konfirmasi penulisan dengan mengkueri
hologres.hg_table_properties. -
Konfirmasi bahwa perilaku benar-benar berubah dengan memantau jumlah file dan ukuran file. Pernyataan yang berhasil tidak membuktikan apa-apa tanpa verifikasi tambahan.
-
-
Tabel partisi mewarisi properti hanya saat pembuatan. Menjalankan
SET_TABLE_PROPERTYpada tabel induk tidak memengaruhi partisi anak yang sudah ada. Properti tersebut hanya ditulis pada tabel induk, dan tabel induk tidak menyimpan data, sehingga perilaku compaction pada partisi yang sudah ada tidak berubah. Partisi anak menyalin properti tabel induk satu kali saat dibuat—termasuk partisi yang dibuat otomatis melalui partisi dinamis—dan perubahan selanjutnya pada induk tidak disebarkan. Untuk mengubah perilaku compaction pada tabel partisi, jalankanSET_TABLE_PROPERTYpada setiap partisi anak target dan verifikasi masing-masing. Atur juga properti pada tabel induk jika Anda ingin partisi mendatang mewarisinya. -
Tutup loop dengan pengamatan. Kueri
hologres.hg_table_file_statusuntuk jumlah file dan ukuran file saat ini,hologres.hg_partition_file_statusuntuk tampilan per partisi tabel partisi logis, danhologres.hg_table_info(dihasilkan sekali sehari) untuk meninjau tren. Penyesuaian yang berhasil menunjukkan penurunan jumlah file total dan peningkatan ukuran file rata-rata. Penggunaan penyimpanan dapat naik sementara saat file hasil penggabungan menunggu pembersihan; hal ini wajar.SELECT * FROM hologres.hg_table_file_status('<schema_name>.<table_name>'::regclass);
Remote compaction
Mulai Hologres V5.0, Anda dapat memindahkan fase penggabungan tugas compaction ke gudang virtual terpisah. Compaction tidak lagi bersaing untuk sumber daya komputasi pada gudang virtual utama, sehingga menjaga stabilitas performa kueri dan penulisan online. Fitur ini juga dikenal sebagai compaction offload.
Prasyarat dan batasan
-
Remote compaction memerlukan Hologres V5.0 atau versi yang lebih baru.
-
Tabel berorientasi baris, tabel berorientasi kolom, dan tabel hybrid baris-kolom semuanya mendukung remote compaction. Namun, beberapa strategi compaction internal tidak dapat di-offload, dan tugas tersebut tetap berjalan secara lokal.
-
Remote compaction hanya mencakup fase penggabungan file. Pembacaan dan penulisan data tetap berjalan di gudang virtual utama.
-
Secara default, tugas remote compaction yang gagal tidak kembali ke eksekusi lokal. Tugas tersebut langsung gagal dan penjadwal latar belakang akan mencoba ulang secara otomatis. Untuk mengaktifkan kembali perilaku fallback, atur parameter global
enable_compaction_offload_fallbackketrue.
Konfigurasi compaction_resource
Properti tabel compaction_resource menetapkan gudang virtual yang menjalankan tugas compaction untuk satu tabel. Perubahan berlaku segera, dan Anda tidak perlu restart instans.
Sintaks
-- Offload compaction untuk tabel ke gudang virtual tertentu
CALL SET_TABLE_PROPERTY('<SCHEMA_NAME>.<TABLE_NAME>', 'compaction_resource', '<WAREHOUSE_NAME>');
-- Jalankan compaction di gudang virtual lokal lagi (default)
CALL SET_TABLE_PROPERTY('<SCHEMA_NAME>.<TABLE_NAME>', 'compaction_resource', 'local');
Contoh
-- Offload compaction untuk public.orders ke gudang virtual bernama readonly
CALL SET_TABLE_PROPERTY('public.orders', 'compaction_resource', 'readonly');
-- Kueri pengaturan saat ini
SELECT property_key, property_value
FROM hologres.hg_table_properties
WHERE table_namespace = 'public'
AND table_name = 'orders'
AND property_key = 'compaction_resource';
Hasil kosong, atau nilai local, berarti tabel menjalankan compaction secara lokal.
Lihat status compaction
Panggil hologres.hg_show_compactions() untuk menampilkan daftar tugas compaction yang sedang berjalan dan yang telah selesai, termasuk yang dijalankan secara remote.
Record yang dikembalikan oleh hologres.hg_show_compactions() disimpan di memori. Record tersebut dihapus saat instans restart. Record disimpan berdasarkan waktu akhir tugas: record yang telah mencapai status terminal disimpan selama 600 detik (10 menit) secara default.
-- Tampilkan semua record compaction
SELECT * FROM hologres.hg_show_compactions();
-- Tampilkan record compaction yang dijalankan secara remote
SELECT table_name, status, compaction_reason, execution_location,
warehouse_name, start_time, end_time, extended_cost, last_error
FROM hologres.hg_show_compactions()
WHERE execution_location = 'warehouse'
ORDER BY start_time DESC;
Fungsi ini mengembalikan bidang-bidang berikut.
|
Field |
Description |
|
|
Nama database. Hanya record untuk database saat ini yang dikembalikan. |
|
|
Nama skema. |
|
|
Nama tabel. |
|
|
ID tabel. |
|
|
ID shard data. |
|
|
Identifier tugas compaction. |
|
|
Status tugas. Nilai valid: |
|
|
Alasan yang memicu tugas. Misalnya, |
|
|
Pengaturan |
|
|
Lokasi tugas benar-benar dijalankan. |
|
|
Nama gudang virtual yang menjalankan tugas secara remote. Kosong untuk eksekusi lokal. |
|
|
Waktu tugas masuk antrian penjadwalan. |
|
|
Waktu tugas mencapai status terminal. Kosong selama tugas masih berjalan. |
|
|
Progres. Bidang cadangan, saat ini selalu |
|
|
Waktu yang dikonsumsi di setiap fase, dalam format JSON. |
|
|
Statistik input dan output, dalam format JSON. |
|
|
Pesan error jika tugas gagal. Kosong jika berhasil. |
Contoh
Contoh berikut memindahkan compaction untuk tabel ke gudang virtual remote, lalu memicu full compaction secara manual.
-- 1. Pastikan gudang virtual target ada. Buat di Konsol Hologres
-- atau melalui API. Contoh ini menggunakan yang bernama readonly.
-- 2. Konfigurasi tabel untuk menggunakan remote compaction.
CALL SET_TABLE_PROPERTY('public.lineitem', 'compaction_resource', 'readonly');
-- 3. Picu full compaction. Fase penggabungan dijalankan di gudang virtual readonly.
SELECT hologres.hg_full_compact_table('public.lineitem');
-- 4. Tunggu compaction selesai.
SELECT hologres.hg_wait_table_full_compact('public.lineitem');
-- 5. Tinjau record remote compaction.
SELECT table_name, status, compaction_reason, execution_location,
warehouse_name, start_time, end_time, extended_cost,
extended_stats, last_error
FROM hologres.hg_show_compactions()
WHERE table_name = 'lineitem'
AND execution_location = 'warehouse'
ORDER BY start_time DESC;