Fixed Plan adalah optimasi unik untuk mesin eksekusi Hologres. Topik ini menjelaskan kondisi dan pengaturan parameter yang harus dipenuhi oleh pernyataan SQL agar dapat menggunakan Fixed Plan.
Informasi latar belakang
Fixed Plan adalah optimasi unik untuk mesin eksekusi Hologres. Eksekusi SQL tradisional melibatkan beberapa komponen, seperti pengoptimal (optimizer), koordinator (coordinator), mesin kueri (query engine), dan mesin penyimpanan (storage engine). Fixed Plan menggunakan jalur pintas untuk mengoptimalkan eksekusi SQL dengan melewati overhead dari optimizer, coordinator, dan sebagian query engine. Fixed Plan menghubungkan Fixed FrontEnd langsung ke Fixed Query Engine guna meningkatkan efisiensi eksekusi SQL secara signifikan. Ini merupakan metode optimasi utama yang mendukung penulisan real-time ber-throughput tinggi dan kueri ber-konkurensi tinggi. Untuk informasi selengkapnya tentang Fixed Plan, lihat Arsitektur layanan.
Di Hologres, Fixed Plan digunakan secara default dalam skenario berikut:
-
Penulisan data real-time dari Flink ke Hologres.
-
Penulisan data real-time dari integrasi data DataWorks ke Hologres.
-
Penulisan data dari Holo Client ke Hologres.
Untuk skenario penulisan lainnya, Anda dapat mengonfigurasi pernyataan SQL agar menggunakan Fixed Plan. Untuk informasi selengkapnya, lihat bagian berikut.
Pada skenario di atas, pernyataan SQL yang memenuhi kondisi akan menggunakan Fixed Plan secara default. Namun, tidak semua pernyataan SQL dalam skenario tersebut pasti memenuhi kondisi untuk menggunakan Fixed Plan.
Parameter GUC terkait
-
Daftar GUC
Tabel berikut menjelaskan parameter untuk Fixed Plan. Nilai setiap parameter dapat berupa on atau off. Semua parameter diaktifkan secara default di Holo Client dan berlaku pada tingkat sesi.
Nama GUC
Skenario
Nilai default
Riwayat perubahan GUC
hg_experimental_enable_fixed_dispatcher
Memeriksa apakah Fixed Plan diaktifkan untuk instans.
Mendukung Fixed Plan untuk operasi INSERT, UPDATE, DELETE satu record, serta kueri PrefixScan.
on
Tidak berlaku.
hg_experimental_enable_fixed_dispatcher_for_multi_values
Mengontrol Fixed Plan untuk operasi INSERT multi-record.
CatatanAtomisitas tidak dijamin. Saat menulis beberapa record sekaligus, tidak adanya error menunjukkan bahwa semua record berhasil ditulis. Jika terjadi error, hanya satu error yang dilaporkan. Hal ini mungkin berarti tidak ada record yang ditulis, atau hanya sebagian record yang ditulis. Aplikasi menerima error untuk record yang gagal dan dapat mencoba ulang operasi tersebut.
on
Mulai dari Hologres V1.3.35, parameter GUC ini mendukung Fixed Plan untuk operasi INSERT, UPDATE, dan DELETE multi-record.
hg_experimental_enable_fixed_dispatcher_autofill_series
Mengaktifkan penulisan Fixed Plan untuk tabel yang berisi kolom bertipe data serial. Aktifkan parameter ini pada tingkat sesi klien.
off
Mulai dari Hologres V1.3.25, nilai default parameter GUC ini adalah
on.hg_experimental_enable_fixed_dispatcher_for_update
Mengaktifkan Fixed Plan untuk operasi UPDATE. Aktifkan parameter ini pada tingkat sesi klien.
off
Mulai dari Hologres V1.3.25,
hg_experimental_enable_fixed_dispatcher_for_updatetelah ditinggalkan. Pernyataan UPDATE yang memenuhi kondisi akan menggunakan Fixed Plan secara default. Namun, untuk memperbarui beberapa record, Anda harus mengaturset hg_experimental_enable_fixed_dispatcher_for_multi_values =on.hg_experimental_enable_fixed_dispatcher_for_delete
Mengaktifkan Fixed Plan untuk operasi DELETE. Aktifkan parameter ini pada tingkat sesi klien.
off
Mulai dari Hologres V1.3.25,
hg_experimental_enable_fixed_dispatcher_for_deletetelah ditinggalkan. Pernyataan DELETE yang memenuhi kondisi akan menggunakan Fixed Plan secara default. Namun, untuk menghapus beberapa record, Anda harus mengaturset hg_experimental_enable_fixed_dispatcher_for_multi_values =on.hg_experimental_enable_fixed_dispatcher_for_scan
Mengaktifkan Fixed Plan untuk kueri PrefixScan.
CatatanKueri PrefixScan hanya menyediakan beberapa kolom pertama dari kunci primer komposit sebagai kondisi filter. Kueri Fixed Plan dalam skenario PrefixScan tidak didukung untuk tabel berorientasi kolom.
off
Gunakan Hologres V1.3.35 atau versi yang lebih baru.
hg_experimental_enable_bhclient_cache_on_session
Mengubah mode cache. Terdapat dua mode yang tersedia.
-
on: Menggunakan mode cached on session.
-
off: Menggunakan mode cached on fe.
CatatanDaftar berikut menjelaskan perbedaan antara cached on session dan cached on fe.
-
cached on session: Setiap koneksi memiliki Writer dan Reader sendiri. Ini memberikan throughput yang lebih baik untuk satu koneksi tetapi memiliki waktu startup yang lebih lambat. Waktu startup diperlukan untuk operasi baca atau tulis pertama pada setiap tabel.
-
cached on fe: Semua koneksi pada node frontend (FE) berbagi Writer dan Reader yang sama. Writer dan Reader tidak ditutup saat koneksi dihentikan. Oleh karena itu, tidak ada waktu startup.
off
Tidak berlaku.
hg_experimental_disable_fixed_planner_conflict_pk_check
Mengontrol apakah kolom dalam sintaks
INSERT INTO <table_name> VALUES (...) ON CONFLICT(<column>)dapat berupa bidang non-primary key.-
false: Tidak didukung.
-
true: Didukung.
CatatanJika parameter GUC ini diatur ke true, kolom tersebut dapat berupa bidang non-primary key. Namun, saat pernyataan INSERT ON CONFLICT dieksekusi, data tetap diproses berdasarkan apakah kunci primernya duplikat (
ON CONFLICT(pk)).
false
-
Di Hologres V1.3 hingga V2.1.28, bidang dalam
ON CONFLICT(<column>)harus berupa bidang primary key. -
Mulai dari Hologres V2.1.29, parameter GUC ini mengontrol apakah bidang dalam
ON CONFLICT(<column>)dapat berupa bidang non-primary key.
-
-
Menggunakan parameter GUC
-
Memeriksa apakah parameter GUC diaktifkan
Jalankan perintah show untuk memeriksa apakah parameter GUC diaktifkan. Sintaksnya sebagai berikut:
SHOW <GUC_name>;Contoh berikut menunjukkan cara menggunakan perintah tersebut.
-- Periksa apakah Fixed Plan diaktifkan untuk instans. SHOW hg_experimental_enable_fixed_dispatcher; -
Mengaktifkan parameter GUC
-
Mengaktifkan parameter GUC pada tingkat sesi
Jalankan perintah
setuntuk mengatur parameter GUC pada tingkat sesi. Parameter tingkat sesi hanya berlaku untuk sesi saat ini dan menjadi tidak valid setelah koneksi dihentikan. Tambahkan perintah tersebut sebelum pernyataan SQL dan eksekusi bersamaan. Sintaksnya sebagai berikut:SET <GUC_name> = <values>;GUC_name adalah nama parameter GUC. values adalah nilai parameter GUC.
Contoh berikut menunjukkan cara menggunakan perintah tersebut.
-- Aktifkan Fixed Plan untuk penulisan INSERT ON CONFLICT multi-record. SET hg_experimental_enable_fixed_dispatcher_for_multi_values = on; -
Mengaktifkan parameter GUC pada tingkat database
Jalankan perintah
alter database xx set xxxuntuk mengatur parameter GUC pada tingkat database. Pengaturan ini berlaku untuk seluruh database setelah perintah dijalankan. Anda harus membuat koneksi ulang ke database agar pengaturan berlaku. Pengaturan ini tidak berlaku untuk database baru. Anda harus mengaturnya kembali untuk database baru. Sintaksnya sebagai berikut:ALTER DATABASE <db_name> SET <GUC_name> = <values>;db_name adalah nama database, GUC_name adalah nama parameter GUC, dan values adalah nilai parameter GUC.
Contoh berikut menunjukkan cara menggunakan perintah tersebut.
--Aktifkan Fixed Plan pada tingkat DB. ALTER DATABASE <db_name> SET hg_experimental_enable_fixed_dispatcher = on;
-
-
Persyaratan tipe data
-
Tidak ada kolom dalam tabel yang bertipe MONEY atau MONEY ARRAY.
-
Tipe data berikut didukung untuk kolom dalam operasi bahasa manipulasi data (DML), seperti INSERT, UPDATE, dan DELETE, serta operasi SELECT. Untuk operasi SELECT, ini berlaku baik untuk kolom target maupun kolom dalam klausa WHERE.
-
BOOLEAN (alias: BOOL)
-
SMALLINT
-
INTEGER (alias: INT atau INT4)
-
BIGINT (alias: INT8)
-
FLOAT (alias: FLOAT4)
-
DOUBLE PRECISION (alias: FLOAT8)
-
CHAR(n)
-
VARCHAR(n) (Di Hologres V1.1.79 dan versi yang lebih baru, tipe VARCHAR dapat menggunakan Fixed Plan.)
-
BYTEA
-
JSON dan JSONB
-
TEXT (alias: VARCHAR)
-
TIMESTAMP WITH TIME ZONE (alias: TIMESTAMPTZ)
-
DATE
-
TIMESTAMP
-
DECIMAL (alias: NUMERIC)
-
ROARINGBITMAP
-
TIME (didukung di Hologres V2.2 dan versi yang lebih baru)
-
TIMETZ (didukung di Hologres V2.2 dan versi yang lebih baru)
-
Tipe array
-
boolean[]
-
smallint[]
-
int4[]
-
int8[]
-
float4[]
-
float8[]
-
char(n)[]
-
varchar(n)[]
-
text[]
-
-
Skenario INSERT
Mulai dari Hologres V3.2, klausa RETURNING didukung untuk operasi INSERT Fixed Plan pada tabel yang memiliki primary key.
-
Pernyataan INSERT
Fixed Plan mendukung klausa INSERT berikut.
-- Menulis satu record. INSERT INTO TABLE(col1,col2,col3..) VALUES(?,?,?..) ON conflict xxx; -- Menulis beberapa record. INSERT INTO TABLE(col1,col2,col3..) VALUES(?,?,?..),(?,?,?..) ON conflict xxx;Catatan-
Anda dapat menggunakan perintah INSERT untuk menulis data ke tabel internal, tetapi tidak ke tabel eksternal.
-
Anda dapat menggunakan perintah INSERT untuk menulis data ke tabel partisi. Di Hologres V1.3 dan versi yang lebih baru, Anda dapat menulis data ke tabel induk dari tabel partisi.
-
Di versi sebelum Hologres V3.2, pernyataan INSERT tidak mendukung kata kunci
RETURNING. Kata kunci ini didukung di Hologres V3.2 dan versi yang lebih baru.
-
-
Insert satu record dengan on conflict
-
Skenario berikut didukung.
-
Klausa tanpa
on conflictdidukung. -
Klausa dengan
on conflict do nothingdidukung. -
Untuk
on conflict do update, Anda harus memperbarui semua kolom non-primary key (PK) yang ditentukan dalam pernyataan INSERT. Anda dapat memilih apakah akan memperbarui kolom PK atau tidak. Pembaruan harus dalam formatcol = excluded.col. Di Hologres V1.3 dan versi yang lebih baru, Anda dapat memperbarui sebagian kolom non-PK, tetapi pembaruan tetap harus dalam formatcol = excluded.col.
-
-
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_insert_oneline ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); COMMIT; -- Perbarui semua kolom non-PK. Pernyataan ini dapat menggunakan Fixed Plan. INSERT INTO test_insert_oneline VALUES (1, 2, 3, 4) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1, col2 = excluded.col2; -- Perbarui semua kolom (termasuk kolom PK dan non-PK). Pernyataan ini dapat menggunakan Fixed Plan. INSERT INTO test_insert_oneline VALUES (1, 2, 3, 4) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1, col2 = excluded.col2, pk1 = excluded.pk1, pk2 = excluded.pk2; -- Anda harus memperbarui semua kolom non-PK yang akan dimasukkan. Contoh ini tidak menyertakan col2. Fixed Plan hanya didukung di Hologres V1.3 dan versi yang lebih baru. INSERT INTO test_insert_oneline VALUES (1, 2, 3, 4) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1; -- Pembaruan harus dalam format 'set col = excluded.col'. Oleh karena itu, pernyataan ini tidak dapat menggunakan Fixed Plan. INSERT INTO test_insert_oneline VALUES (1, 2, 3, 4) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1, col2 = 5;
-
-
Insert multi-record dengan on conflict
-
Klausa untuk operasi Insert multi-record dengan on conflict adalah sebagai berikut.
SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; INSERT INTO TABLE (col1, col2, col3..) VALUES (?, ?, ?..), (?, ?, ?..) ON CONFLICT xxx;-
Anda harus mengatur parameter GUC:
hg_experimental_enable_fixed_dispatcher_for_multi_values = on;. Mulai dari Hologres 1.3.35, nilai default parameter ini adalahon. -
Atomisitas tidak dijamin. Saat menulis beberapa record sekaligus, jika tidak ada error yang dilaporkan, semua record berhasil ditulis. Jika terjadi error, kemungkinan tidak ada record yang ditulis, atau hanya sebagian record yang ditulis.
-
-
Cara lain untuk menulis klausa multi-record adalah sebagai berikut.
SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; INSERT INTO TABLE SELECT unnest(ARRAY[TRUE, FALSE, TRUE]::bool[]), unnest(ARRAY[1, 2, 3]::int4[]), unnest(ARRAY[1.11, 2.222, 3]::float4[]) ON CONFLICT xxx;-
Anda harus mengatur parameter GUC:
hg_experimental_enable_fixed_dispatcher_for_multi_values=on;. -
Kolom yang akan ditulis tidak boleh bertipe array.
-
ARRAY dalam fungsi unnest harus secara eksplisit di-cast ke tipe array kolom yang sesuai.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_insert_multiline ( pk1 int8, col1 float4, PRIMARY KEY (pk1) ); COMMIT; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; INSERT INTO test_insert_multiline SELECT unnest(ARRAY[1, 2, 3]::int8[]), unnest(ARRAY[1.11, 2.222, 3]::float4[]) ON CONFLICT DO NOTHING; -- ARRAY dalam unnest tidak di-cast secara eksplisit. Fixed Plan tidak didukung. INSERT INTO test_insert_multiline SELECT unnest(ARRAY[1, 2, 3]), unnest(ARRAY[1.11, 2.222, 3]) ON CONFLICT DO NOTHING; -- Kolom pertama bertipe int8, sehingga harus di-cast ke int8[]. Dalam contoh ini, di-cast ke int4[]. Oleh karena itu, Fixed Plan tidak didukung. INSERT INTO test_insert_multiline SELECT unnest(ARRAY[1, 2, 3]::int4[]), unnest(ARRAY[1.11, 2.222, 3]::float4[]) ON CONFLICT DO NOTHING; -
-
-
Skenario pembaruan parsial
Hologres mendukung pembaruan parsial kolom tabel berdasarkan primary key. Fixed Plan juga mendukung pembaruan parsial jika kondisi berikut terpenuhi.
-
Kolom dalam klausa INSERT harus berkorespondensi satu-satu dengan kolom dalam klausa UPDATE, baik dalam jumlah maupun urutan.
-
Pembaruan harus dalam format
col = excluded.col.
-
-
Upsert kondisional
Untuk menangani data masukan yang tidak berurutan untuk baris dengan PK yang sama, Hologres mendukung pernyataan
INSERTatauUPDATEkondisional yang menggunakan Fixed Plan, mirip dengan antarmuka HBase CheckAndPut. Kondisi berikut harus dipenuhi:-
Didukung saat memasukkan satu record. Saat memasukkan beberapa record, Anda harus mengatur parameter GUC:
set hg_experimental_enable_fixed_dispatcher_for_multi_values=on;. -
Klausa
wherehanya mendukung satu bidang non-PK. Operator perbandingan harus berupa=, <>, >, >=, <, <=, IS NULL, atau IS NOT NULL. Anda dapat menggunakan fungsicoalescepada bidang non-PK ini.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_check_and_insert ( pk INT, col INT, scn INT, PRIMARY KEY (pk) ); COMMIT; -- Fixed Plan didukung. -- Membandingkan nilai kolom yang ada dengan konstanta. INSERT INTO test_check_and_insert AS old VALUES (1, 1, 1) ON CONFLICT (pk) DO UPDATE SET col = excluded.col, scn = excluded.scn WHERE old.scn > 0; -- Membandingkan nilai kolom yang ada dengan nilai yang akan ditulis. INSERT INTO test_check_and_insert AS old VALUES (1, 1, 1) ON CONFLICT (pk) DO UPDATE SET col = excluded.col, scn = excluded.scn WHERE old.scn > excluded.scn; -- Jika nilai yang ada mungkin null, gunakan coalesce. INSERT INTO test_check_and_insert AS old VALUES (1, 1, 1) ON CONFLICT (pk) DO UPDATE SET col = excluded.col, scn = excluded.scn WHERE coalesce(old.scn, 3) > 2; INSERT INTO test_check_and_insert AS old VALUES (1, 1, 1) ON CONFLICT (pk) DO UPDATE SET col = excluded.col, scn = excluded.scn WHERE coalesce(old.scn, 3) > excluded.scn; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; -- Membandingkan nilai kolom yang ada dengan konstanta. INSERT INTO test_check_and_insert AS old VALUES (1, 1, 1), (2, 3, 4) ON CONFLICT (pk) DO UPDATE SET col = excluded.col, scn = excluded.scn WHERE old.scn > 3; -- Sintaks unnest juga didukung. INSERT INTO test_check_and_insert AS old SELECT unnest(ARRAY[5, 6, 7]::int[]), unnest(ARRAY[1, 1, 1]::int[]), unnest(ARRAY[1, 1, 1]::int[]) ON CONFLICT (pk) DO UPDATE SET col = excluded.col, scn = excluded.scn WHERE old.scn > 3; -
-
Kolom default
Jika tabel berisi kolom dengan nilai default, kondisi berikut harus dipenuhi agar Fixed Plan dapat digunakan.
-
Didukung saat memasukkan satu record. Saat memasukkan beberapa record, instans Hologres Anda harus V1.1.36 atau versi yang lebih baru. Jika versi instans Anda lebih lama, tingkatkan instans Anda. Anda juga harus mengatur parameter GUC:
set hg_experimental_enable_fixed_dispatcher_for_multi_values=on;. -
Di Hologres V1.3 dan versi yang lebih baru, Fixed Plan didukung untuk klausa
Insert on conflictpada tabel dengan kolom default. Di versi sebelumnya, Fixed Plan tidak didukung untuk klausaInsert on conflictpada tabel dengan kolom default.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_insert_default ( pk1 INT, col1 INT DEFAULT 99, PRIMARY KEY (pk1) ); COMMIT; -- Fixed Plan didukung. INSERT INTO test_insert_default (pk1) VALUES (1); -- Didukung di V1.1.36 dan versi yang lebih baru. SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; INSERT INTO test_insert_default (pk1) VALUES (1), (2), (3); -
-
Kolom serial
Jika tabel memiliki kolom serial auto-increment, kondisi berikut harus dipenuhi agar Fixed Plan dapat digunakan untuk penulisan satu atau beberapa record.
-
Anda harus mengatur parameter GUC:
set hg_experimental_enable_fixed_dispatcher_autofill_series=on;. Mulai dari Hologres V1.3.25, nilai default parameter GUC ini adalahon. -
Saat memasukkan beberapa record, Anda juga harus mengatur parameter GUC:
set hg_experimental_enable_fixed_dispatcher_for_multi_values=on;.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_insert_serial ( pk1 INT, col1 SERIAL, PRIMARY KEY (pk1) ); COMMIT; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_autofill_series = ON; INSERT INTO test_insert_serial (pk1) VALUES (1); -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_autofill_series = ON; SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; INSERT INTO test_insert_serial (pk1) VALUES (1), (2), (3); -
Skenario UPDATE
-
Pernyataan UPDATE
Klausa UPDATE berikut dapat menggunakan Fixed Plan.
SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE TABLE SET col1 = ?,col2 = ? WHERE pk1 = ? AND pk2 = ?; -
Menggunakan skenario UPDATE
Kondisi berikut harus dipenuhi agar operasi UPDATE dapat menggunakan Fixed Plan.
-
Anda dapat memperbarui tabel internal, tetapi tidak tabel eksternal. Anda dapat memperbarui tabel anak dari tabel partisi, tetapi tidak tabel induk. Tabel harus memiliki primary key (PK).
-
Anda harus mengatur parameter GUC:
hg_experimental_enable_fixed_dispatcher_for_update=on;. Mulai dari Hologres V1.3.25, parameter ini telah ditinggalkan. PernyataanUPDATEyang memenuhi kondisi akan menggunakan Fixed Plan secara default. Namun, untuk memperbarui beberapa baris, Anda harus mengatur parameter GUC:set hg_experimental_enable_fixed_dispatcher_for_multi_values =on. -
Kolom dalam klausa
settidak boleh berupa PK. -
Klausa where harus berisi semua dan hanya PK. Di Hologres V1.3 dan versi yang lebih baru, bidang terakhir dalam klausa where dapat berupa bidang non-PK. Untuk bidang non-PK ini, operator perbandingan
=, <>, >, >=, <, <=, IS NULL, dan IS NOT NULLdan fungsicoalescedidukung. -
Anda dapat menggunakan
pk in (?,?,?) or pk = ANY()untuk memodifikasi beberapa record sekaligus. Contoh:pk1 in (1,2) and pk2 = any('{3,4}') and pk3 = 5memodifikasi empat record:(1,3,5), (1,4,5), (2,3,5), dan (2,4,5). -
Setiap kolom dalam klausa where hanya boleh memiliki satu kondisi. Kondisi identik dianggap sebagai satu kondisi.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_update ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); COMMIT; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 = 3 AND pk2 = 4; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1 WHERE pk1 = 3 AND pk2 = 4; -- Fixed Plan didukung (Hologres V1.3+, klausa where dengan bidang non-PK). SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1 WHERE pk1 = 3 AND pk2 = 4 AND col1 > 3; -- Fixed Plan didukung (Hologres V1.3+, klausa where dengan bidang non-PK dan coalesce). SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1 WHERE pk1 = 3 AND pk2 = 4 AND coalesce(col1, 4) <> 1; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 IN (1, 2) AND pk2 = ANY ('{3,4}'); -- Fixed Plan didukung (Hologres V1.3+, klausa where dengan bidang non-PK). SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1 WHERE pk1 IN (1, 2) AND pk2 = ANY('{3,4}') AND col1 > 3; -- pk1 memiliki beberapa kondisi filter. Fixed Plan tidak didukung. UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 = 3 AND pk1 = 4; -- pk1 memiliki beberapa kondisi filter. Fixed Plan tidak didukung. UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 IN (1, 2) AND pk1 = 1; -- pk1 memiliki beberapa kondisi filter, tetapi kondisinya identik. Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 IN (1, 2) AND pk1 IN (1, 2) AND pk2 = 4; -
Skenario DELETE
-
Pernyataan DELETE
Klausa DELETE berikut dapat menggunakan Fixed Plan.
SET hg_experimental_enable_fixed_dispatcher_for_delete = ON; DELETE FROM TABLE WHERE pk1 = ? AND pk2 = ? AND pk3 = ?; -
Menggunakan skenario DELETE
Kondisi berikut harus dipenuhi agar operasi DELETE dapat menggunakan Fixed Plan.
-
Anda dapat menghapus dari tabel internal, tetapi tidak dari tabel eksternal. Anda dapat menghapus dari tabel anak dari tabel partisi, tetapi tidak dari tabel induk. Tabel harus memiliki primary key (PK).
-
Anda harus mengatur parameter GUC:
hg_experimental_enable_fixed_dispatcher_for_delete=on;. Mulai dari Hologres V1.3.25, parameter ini telah ditinggalkan. PernyataanDELETEyang memenuhi kondisi akan menggunakan Fixed Plan secara default. Namun, untuk menghapus beberapa baris, Anda harus mengatur parameter GUC:set hg_experimental_enable_fixed_dispatcher_for_multi_values =on. -
Klausa
whereharus berisi semua dan hanya PK. Mulai dari Hologres V1.3, bidang terakhir dalam klausawheredapat berupa bidang non-PK. Untuk bidang non-PK ini, operator perbandingan=, <>, >, >=, <, <=, IS NULL, dan IS NOT NULLdan fungsicoalescedidukung. -
Anda dapat menggunakan
pk in (?,?,?) or pk = ANY()untuk menghapus beberapa record sekaligus. Contoh:pk1 in (1,2) and pk2 = any('{3,4}') and pk3 = 5menghapus empat record:(1,3,5), (1,4,5), (2,3,5), dan (2,4,5). -
Setiap kolom hanya boleh memiliki satu kondisi. Kondisi identik dianggap sebagai satu kondisi.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_delete ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); COMMIT; -- Fixed Plan didukung. Untuk skenario lainnya, lihat contoh UPDATE. SET hg_experimental_enable_fixed_dispatcher_for_delete = ON; DELETE FROM test_delete WHERE pk1 = 1 AND pk2 = 2; -
Skenario SELECT
-
Pernyataan SELECT
Klausa SELECT berikut dapat menggunakan Fixed Plan.
SELECT col1, col2, col3, ... FROM TABLE WHERE pk1 = ? AND pk2 = ? AND pk3 = ?;-
Anda dapat memilih dari tabel internal, tetapi tidak dari tabel eksternal.
-
Anda dapat memilih dari tabel anak dari tabel partisi, tetapi tidak dari tabel induk.
-
Tabel harus memiliki primary key (PK).
-
-
Skenario kueri titik (key/value)
Kondisi berikut didukung untuk skenario kueri titik.
-
Klausa where harus berisi semua dan hanya PK.
-
Anda dapat menggunakan
pk in (?,?,?) or pk = ANY()untuk mengkueri beberapa record sekaligus. Contoh:pk1 in (1,2) and pk2 = any('{3,4}') and pk3 = 5mengkueri empat record:(1,3,5), (1,4,5), (2,3,5), dan (2,4,5). -
Setiap kolom hanya boleh memiliki satu kondisi. Kondisi identik dianggap sebagai satu kondisi.
-
Jika terdapat klausa limit, nilai limit harus
>0.
Contoh berikut menunjukkan cara menggunakan pernyataan tersebut.
BEGIN; CREATE TABLE test_select ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); CALL set_table_property ('test_select', 'orientation', 'row'); COMMIT; -- Fixed Plan didukung. SELECT * FROM test_select WHERE pk1 = 1 AND pk2 = 2; -
-
Skenario PrefixScan
-
Klausa skenario PrefixScan
Skenario PrefixScan adalah skenario di mana tabel memiliki primary key komposit, dan kueri hanya menggunakan beberapa kolom pertama dari primary key sebagai kondisi filter berdasarkan prinsip pencocokan prefiks paling kiri. Klausa kueri adalah sebagai berikut.
SET hg_experimental_enable_fixed_dispatcher_for_scan = on; SELECT col1,col2,col3,... FROM TABLE WHERE pk1 = ? AND pk2 = ?; SELECT col1,col2,col3,... FROM TABLE WHERE pk1 = ? AND pk2 < ?;-- Mulai dari V1.1.48, kondisi rentang didukung untuk kolom PK terakhir. SELECT col1,col2,col3,... FROM TABLE WHERE pk1 = ? AND pk2 BETWEEN ? AND ?;-- Mulai dari V1.1.48, kondisi rentang didukung untuk kolom PK terakhir. -
Menggunakan PrefixScan
Kondisi berikut harus dipenuhi untuk menggunakan PrefixScan.
-
Anda harus mengatur parameter GUC:
hg_experimental_enable_fixed_dispatcher_for_scan=on;, dan instans harus Hologres V1.3.35 atau versi yang lebih baru. -
Tabel harus memiliki kunci distribusi, dan klausa
whereharus mencakup semua kolom kunci distribusi. -
Klausa
wherehanya boleh berisi prefiks dari PK. Mulai dari Hologres V1.1.48, PrefixScan mendukung pengaturan kondisi rentang (dengan batas atas dan bawah) untuk kolom terakhir primary key.CatatanDefinisi Prefiks: Jika PK adalah
(pk1,pk2,pk3), maka(pk1),(pk1,pk2)adalah prefiks. -
Hanya tabel berorientasi baris (termasuk tabel hibrida baris-kolom) yang mendukung PrefixScan.
-
Setiap kolom hanya boleh memiliki satu kondisi. Kondisi identik dianggap sebagai satu kondisi.
-
Jika terdapat kondisi limit, nilai limit harus lebih besar dari 0.
CatatanPrefixScan mengembalikan semua baris hasil sekaligus. Jika ukuran hasil dalam byte lebih besar dari
hg_experimental_fixed_scan_bytesize_limit, error akan dilaporkan:scan result size larger than fixed scan size limit. Anda dapat mengatur parameterhg_experimental_fixed_scan_bytesize_limitke nilai yang lebih sesuai untuk skenario Anda. Nilai default adalah 1048576, yaitu 1 MB.Sebagai contoh, asumsikan PK tabel adalah
(pk1,pk2,pk3,pk4)dan kunci distribusi adalahpk1,pk3.BEGIN; CREATE TABLE test_select_prefix ( pk1 INT, pk2 INT, pk3 INT, pk4 INT, PRIMARY KEY (pk1, pk2, pk3, pk4) ); CALL set_table_property ('test_select_prefix', 'orientation', 'row'); CALL set_table_property ('test_select_prefix', 'distribution_key', 'pk1,pk3'); COMMIT; -- Tidak mencakup semua kunci distribusi. Tidak dapat menggunakan Fixed Plan. SELECT * FROM test_select_prefix WHERE pk1 = ? AND pk2 = ?; -- Bukan prefiks dari PK. Tidak dapat menggunakan Fixed Plan. SELECT * FROM test_select_prefix WHERE pk1 = ? AND pk3 = ?; -- Dapat menggunakan Fixed Plan. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_select_prefix WHERE pk1 = ? AND pk2 = ? AND pk3 = ?;Anda dapat menggunakan
pk in (?,?,?)ataupk = ANY()untuk mengkueri beberapa record sekaligus. Perintahnya sebagai berikut.pk1 IN (1,2) AND pk2 = 3 <=> scan(1,3),(2,3) dua kelompok pk2 =any('{3,4}') AND pk1 IN (1,2) <=> scan(1,3),(1,4),(2,3),(2,4) empat kelompok -
-
Contoh
BEGIN; CREATE TABLE test_scan ( pk1 INT, pk2 INT, pk3 INT, col1 INT, PRIMARY KEY (pk1, pk2, pk3) ); CALL set_table_property ('test_scan', 'orientation', 'row'); CALL set_table_property ('test_scan', 'distribution_key', 'pk1,pk2'); COMMIT; INSERT INTO test_scan VALUES (1, 2, 3, 4); -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 = 2; -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 IN (2, 3); -- Fixed Plan didukung. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = ANY ('{3,4}') AND pk2 IN (2, 3); -- Fixed Plan didukung. Kolom PK terakhir memiliki kondisi rentang. Didukung di V1.1.48 dan versi yang lebih baru. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 = 1 AND pk3 > 1 AND pk3 < 4; -- Fixed Plan didukung. Kolom PK terakhir memiliki kondisi rentang. Didukung di V1.1.48 dan versi yang lebih baru. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 = 1 AND pk3 BETWEEN 1 AND 4; -- Tidak mencakup semua kunci distribusi. Fixed Plan tidak didukung. SELECT * FROM test_scan WHERE pk1 = 1; -- Tidak cocok dengan prefiks primary key. Fixed Plan tidak didukung. SELECT * FROM test_scan WHERE pk2 = 2;
-
-
Skenario paging
Mulai dari Hologres V3.2, Fixed Plan mendukung kueri berhalaman dalam skenario PrefixScan berdasarkan primary key parsial. Contoh berikut menunjukkan cara menggunakan fitur ini:
Catatan-
Secara default, hasil Prefix Scan dikembalikan dalam urutan ascending primary key. Dalam pernyataan SQL berikut, PrefixScan dilakukan berdasarkan pk1 dan pk2. Hasil diurutkan dalam urutan ascending pk3.
-
Untuk menentukan urutan pengembalian, Anda dapat mengatur urutan kolom yang sesuai dengan Clustering Key dan menentukan parameter GUC yang sesuai dalam kueri. Hasil akan diurutkan berdasarkan clustering key. Bidang clustering key harus identik dengan primary key. Dalam pernyataan SQL berikut, untuk mengembalikan hasil dalam urutan descending, Anda dapat secara manual menentukan item terakhir clustering key sebagai
pk3:desc.
-
Mengurutkan hasil berhalaman dalam urutan ascending
-- Membuat tabel. CREATE TABLE test_scan( pk1 INT, pk2 INT, pk3 INT, col1 INT, PRIMARY KEY(pk1, pk2, pk3) ) WITH ( orientation = 'row', distribution_key = 'pk1,pk2', clustering_key = 'pk1:asc,pk2:asc,pk3:asc' ); -- Menulis data. INSERT INTO test_scan VALUES (1,2,3,4),(1,2,5,6),(1,2,7,8); -- offset + limit didukung. Berdasarkan Prefix Scan, mengembalikan jumlah baris tertentu mulai dari baris tertentu. SET hg_experimental_enable_fixed_dispatcher_for_scan = on; -- Secara default, hasil diurutkan dalam urutan ascending pk3. SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 = 2 OFFSET 1 limit 2; -
Mengurutkan hasil berhalaman dalam urutan descending
-- Membuat tabel. CREATE TABLE test_scan( pk1 INT, pk2 INT, pk3 INT, col1 INT, PRIMARY KEY(pk1, pk2, pk3) ) WITH ( orientation = 'row', distribution_key = 'pk1,pk2', clustering_key = 'pk1:asc,pk2:asc,pk3:desc' ); -- Menulis data. INSERT INTO test_scan VALUES (1,2,3,4),(1,2,5,6),(1,2,7,8); -- Aktifkan dua parameter GUC berikut. Hasil akan diurutkan dalam urutan descending pk3. SET hg_experimental_enable_fixed_dispatcher_for_scan = on; SET hg_experimental_enable_fixed_dispatcher_for_clustering_key_scan = on; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 = 2 OFFSET 1 limit 2;
-
Skenario COPY
Mulai dari Hologres 1.3.17, pernyataan COPY mendukung Fixed Plan. Fitur ini disebut Fixed Copy. Untuk perbandingan antara COPY dan Fixed Copy, lihat Perbandingan mode penulisan batch.
Untuk informasi tentang pengaturan parameter untuk Fixed Copy, lihat COPY. Contoh berikut menunjukkan cara menggunakan perintah tersebut.
COPY table_name (column0, column1, column2)
FROM
STDIN WITH (
format BINARY,
stream_mode TRUE,
on_conflict UPDATE);
Perilaku untuk daftar kolom yang tidak lengkap.
-
Jika operasi COPY menulis ke subset kolom, ini merupakan pembaruan parsial. Perilakunya sebagai berikut:
CREATE TABLE t0 ( id INT NOT NULL, name TEXT, age INT, PRIMARY KEY (id) ); COPY t0 (id, name) FROM STDIN WITH (stream_mode TRUE, on_conflict UPDATE); -- Pernyataan COPY di atas setara dengan pernyataan INSERT INTO berikut. INSERT INTO t0 (id, name) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET id = excluded.id, name = excluded.name; -
Jika operasi COPY menulis ke subset kolom, dan kolom yang tidak ditulis memiliki atribut nilai default, perilakunya sebagai berikut:
CREATE TABLE t0 ( id INT NOT NULL, name TEXT, age INT DEFAULT 0, PRIMARY KEY (id) ); COPY t0 (id, name) FROM STDIN WITH (stream_mode TRUE, on_conflict UPDATE); -- Pernyataan COPY di atas setara dengan pernyataan INSERT INTO berikut. -- Jika data id tidak ada, kolom age diberi nilai default. -- Jika data id sudah ada, kolom age tidak diperbarui. INSERT INTO t0 (id, name, age) VALUES (?, ?, DEFAULT) ON CONFLICT (id) DO UPDATE SET id = excluded.id, name = excluded.name;
Dukungan ekspresi dalam Fixed Plan
Mulai dari Hologres V3.2, Fixed Plan mendukung ekspresi dalam pernyataan SQL untuk skenario berikut. Untuk informasi selengkapnya tentang ekspresi PostgreSQL, lihat PostgreSQL Expressions. Ekspresi didukung dalam semua skenario berikut:
-
Pernyataan INSERT:
-
Klausa values.
-
Klausa Insert On Conflict Do Update.
-
Kondisi filter dalam klausa Insert On Conflict Where.
-
Klausa RETURNING.
-
-
Pernyataan SELECT
SELECT bidang.
Batasan
-
Hanya ekspresi dan fungsi skalar yang didukung. Fungsi agregat, fungsi jendela, dan subkueri tidak didukung.
-
Dalam pernyataan INSERT, ekspresi atau fungsi dalam klausa selain klausa VALUES harus dapat dieksekusi di HQE.
-
Dalam pernyataan SELECT, hanya ekspresi atau fungsi IMMUTABLE yang didukung, dan fungsi tersebut harus mendukung parameter input konstan.
-
Untuk menggunakan fitur ini, aktifkan parameter berikut:
-- Aktifkan pada tingkat sesi. SET hg_experimental_enable_fixed_plan_expression = on; -- Aktifkan pada tingkat DB. ALTER DATABASE <db_name> SET hg_experimental_enable_fixed_plan_expression = on;
Contoh
-
Ekspresi didukung dalam empat sub-klausa pernyataan INSERT
-- Membuat tabel. CREATE TABLE test_t ( id INT PRIMARY KEY, col INT, ts TIMESTAMP ) WITH ( orientation = 'row', distribution_key = 'id' ); -- Aktifkan parameter GUC. SET hg_experimental_enable_fixed_plan_expression = ON; -- Klausa values berisi ekspresi. INSERT INTO test_t VALUES (1, 1, now()); -- Klausa on conflict do update berisi ekspresi. INSERT INTO test_t AS old VALUES (1, 1, now()) ON CONFLICT (id) DO UPDATE SET col = excluded.col + old.col, ts = excluded.ts; -- Klausa on conflict where berisi ekspresi. INSERT INTO test_t AS old VALUES (1, 1, now()) ON CONFLICT (id) DO UPDATE SET col = excluded.col + old.col, ts = excluded.ts WHERE excluded.ts > old.ts; -- Klausa returning berisi ekspresi. INSERT INTO test_t AS old VALUES (1, 1, now()) ON CONFLICT (id) DO UPDATE SET col = excluded.col + old.col, ts = excluded.ts WHERE excluded.ts > old.ts RETURNING 2 * col, ts; -
Ekspresi didukung dalam bidang SELECT pernyataan SELECT
-
Skenario kueri titik berdasarkan semua primary key: Contoh ini menunjukkan cara mengekstrak nilai kunci dari bidang JSONB.
-- Membuat tabel. CREATE TABLE test_t ( id int PRIMARY KEY, ts TIMESTAMP NOT NULL, col JSONB ) WITH ( orientation = 'row', distribution_key = 'id' ); -- Bidang Select berisi ekspresi dan mendukung operator Jsonb. SELECT (col ->> 'b')::int + (col ->> 'a')::int, date_trunc('day', ts) FROM test_t WHERE id = 1; -
Skenario prefix scan berdasarkan primary key parsial (Prefixscan).
-- Membuat tabel. CREATE TABLE test_t ( id INT, ts TIMESTAMP NOT NULL, col JSONB, PRIMARY KEY (id, ts) ) WITH ( orientation = 'row', distribution_key = 'id' ); -- Aktifkan parameter GUC. SET hg_experimental_enable_fixed_dispatcher_for_scan = TRUE; -- Bidang Select berisi ekspresi. SELECT (col ->> 'b')::int + (col ->> 'a')::int, date_trunc('day', ts) FROM test_t WHERE id = 1;
-
-
Untuk pernyataan SELECT, jika mengandung skenario non-IMMUTABLE atau fungsi yang tidak mendukung parameter input konstan, tidak dapat dioptimalkan oleh Fixed Plan.
-- Membuat tabel. CREATE TABLE test_t ( id INT PRIMARY KEY, ts TIMESTAMP NOT NULL, col JSONB ) WITH ( orientation = 'row', distribution_key = 'id' ); -- Fungsi random() bukan ekspresi fungsi immutable. Fixed Plan tidak didukung. SELECT id + random() FROM test_t WHERE id = 1; -- Fungsi toString tidak mendukung parameter input konstan. Fixed Plan tidak didukung. SELECT toString (id) FROM test_t WHERE id = 1;
Verifikasi Fixed Plan
-
Pernyataan SQL tipe update, termasuk operasi INSERT, UPDATE, dan DELETE, yang dieksekusi menggunakan Fixed Plan ditampilkan sebagai tipe SDK pada panel RPS Impor Real-time di konsol. Optimalkan operasi penulisan real-time seperti INSERT, UPDATE, dan DELETE agar menggunakan Fixed Plan untuk meningkatkan efisiensi pembaruan data. Gambar berikut menunjukkan contoh metrik pemantauan:

-
Lihat rencana eksekusi SQL dengan menjalankan perintah EXPLAIN. Jika rencana eksekusi yang dikembalikan berisi
FixedXXXNode, Fixed Plan dipicu, seperti yang ditunjukkan pada gambar berikut. Jika rencana eksekusi yang berisiFixedXXXNodetidak dihasilkan, periksa apakah kondisi yang dijelaskan pada bagian sebelumnya telah dipenuhi.
Penyetelan performa
Jika Anda telah mengaktifkan Fixed Plan tetapi masih perlu menyetel performa, Anda dapat menggunakan metode berikut.
-
Lihat rencana eksekusi untuk mengidentifikasi bottleneck performa dalam Fixed Plan: Anda dapat melihat rencana eksekusi SQL (EXPLAIN) untuk menganalisis waktu yang dikonsumsi di setiap fase Fixed Plan dan menemukan bottleneck performa.
-
Hologres V1.1.49 dan versi yang lebih baru dioptimalkan untuk skenario kueri titik Fixed Plan, yang dapat meningkatkan throughput lebih dari 30% untuk kueri titik skala besar. Jika diperlukan, tingkatkan instans Anda ke V1.1.49 atau versi yang lebih baru.
-
Gunakan ukuran batch yang wajar di sisi klien. Holo Client secara otomatis melakukan batching data. Ukuran batch adalah jumlah perintah SQL yang dieksekusi sekaligus. Dalam praktiknya, performa lebih baik ketika ukuran batch adalah 512 atau kelipatan 512.
FAQ
-
Masalah 1: Error koneksi:
role/database does not exist.-
Penyebab: Pengguna atau DB tidak ada.
-
Solusi: Periksa informasi koneksi dan masukkan username atau nama DB yang benar.
Masuk ke atau Hologres management console, klik Actions pada kolom Manage instans target, lalu klik Database Management. Pada halaman Users dan Database Authorization, peroleh dan konfirmasi nama pengguna atau nama database.
-
-
Masalah 2: Terjadi kesalahan saat menulis data:
the requested table name: xxx (id: xx, version: xx) mismatches the version of the table (id: xx, version: xx) from server.-
Penyebab: Metadata tabel, seperti penambahan kolom, berubah selama proses penulisan data. Hal ini menyebabkan versi tabel berubah.
-
Solusi: Buat koneksi ulang. Fixed Plan kemudian akan mengambil metadata tabel baru dan melakukan operasi penulisan.
-