Rencana tetap adalah fitur optimasi mesin eksekusi yang unik untuk Hologres. Topik ini menjelaskan prasyarat dan konfigurasi parameter yang diperlukan agar suatu pernyataan SQL memenuhi syarat untuk menggunakan rencana tetap.
Informasi latar belakang
Rencana tetap adalah metode optimasi mesin eksekusi yang unik untuk Hologres. Eksekusi SQL tradisional melibatkan beberapa komponen, seperti pengoptimal, koordinator, mesin kueri, dan mesin penyimpanan. Sebaliknya, rencana tetap menggunakan jalur pintas yang melewati pengoptimal, koordinator, dan sebagian mesin kueri untuk mengurangi overhead pemrosesan. Antarmuka depan tetap terhubung langsung ke mesin kueri tetap, sehingga secara signifikan meningkatkan efisiensi eksekusi SQL. Optimasi utama ini memungkinkan penulisan real-time ber-throughput tinggi dan kueri ber-konkurensi tinggi. Untuk informasi lebih lanjut tentang rencana tetap, lihat arsitektur produk.
Di Hologres, rencana tetap digunakan secara default dalam skenario berikut:
-
Penulisan real-time ke Hologres menggunakan Flink.
-
Penulisan real-time ke Hologres menggunakan Data Integration dari DataWorks.
-
Penulisan ke Hologres menggunakan Holo Client.
Untuk skenario penulisan lainnya, Anda dapat mengonfigurasi pernyataan SQL agar menggunakan rencana tetap. Untuk informasi lebih lanjut, lihat bagian berikut.
Dalam skenario ini, Hologres menggunakan rencana tetap secara default untuk pernyataan SQL yang memenuhi syarat. Namun, tidak semua pernyataan SQL dalam skenario ini memenuhi syarat.
Parameter GUC terkait
-
Daftar parameter GUC
Parameter berikut digunakan untuk mengonfigurasi Rencana Tetap. Nilai setiap parameter dapat berupa on atau off. Semua parameter diaktifkan secara default di Holo Client dan berlaku pada tingkat sesi.
Parameter
Deskripsi
Default
Riwayat perubahan
hg_experimental_enable_fixed_dispatcher
Mengontrol apakah akan mengaktifkan fitur rencana tetap untuk instans.
Mendukung rencana tetap untuk operasi
INSERT,UPDATE,DELETE, danPrefixScansatu baris.on
N/A.
hg_experimental_enable_fixed_dispatcher_for_multi_values
Mengontrol apakah akan menggunakan rencana tetap untuk operasi
INSERTmulti-baris.CatatanAtomisitas tidak dijamin. Untuk insert multi-baris, operasi yang berhasil berarti semua baris telah dimasukkan. Jika terjadi kesalahan, sistem mengembalikan satu pesan yang mungkin menunjukkan insert parsial atau kegagalan total. Aplikasi klien bertanggung jawab untuk mencoba ulang baris yang gagal.
on
Mulai dari Hologres V1.3.35, parameter GUC ini memungkinkan operasi
INSERT,UPDATE, danDELETEmulti-baris menggunakan rencana tetap.hg_experimental_enable_fixed_dispatcher_autofill_series
Mendukung rencana tetap untuk penulisan ke tabel yang berisi kolom tipe
SERIAL. Kami merekomendasikan mengaktifkan parameter ini pada tingkat sesi.on
Nilai default diubah menjadi
ondi Hologres V1.3.25.hg_experimental_enable_fixed_dispatcher_for_update
Mendukung rencana tetap untuk operasi
UPDATE. Kami merekomendasikan mengaktifkan parameter ini pada tingkat sesi.off
Mulai dari Hologres V1.3.25, parameter
hg_experimental_enable_fixed_dispatcher_for_updatesudah tidak digunakan lagi. Pernyataan UPDATE yang memenuhi syarat menggunakan rencana tetap secara default. Namun, untuk memperbarui beberapa baris, Anda harus mengonfigurasiset hg_experimental_enable_fixed_dispatcher_for_multi_values = on.hg_experimental_enable_fixed_dispatcher_for_delete
Mendukung rencana tetap untuk operasi
DELETE. Kami merekomendasikan mengaktifkan parameter ini pada tingkat sesi.off
Mulai dari Hologres V1.3.25, parameter
hg_experimental_enable_fixed_dispatcher_for_deletesudah tidak digunakan lagi. Pernyataan DELETE yang memenuhi syarat menggunakan rencana tetap secara default. Namun, untuk menghapus beberapa baris, Anda harus mengonfigurasiset hg_experimental_enable_fixed_dispatcher_for_multi_values = on.hg_experimental_enable_fixed_dispatcher_for_scan
Mendukung rencana tetap untuk kueri
PrefixScan.CatatanKueri
PrefixScanadalah kueri pada tabel dengan kunci primer komposit di mana kondisi kueri hanya menentukan kolom awal dari kunci primer. Rencana tetap untuk kueriPrefixScanpada tabel berorientasi kolom saat ini tidak didukung.off
Hologres V1.3.35 atau versi yang lebih baru direkomendasikan.
hg_experimental_enable_bhclient_cache_on_session
Mengontrol mode caching. Tersedia dua mode.
-
on: Menggunakan mode
cached on session. -
off: Menggunakan mode
cached on fe.
CatatanDaftar berikut membandingkan mode
cached on sessiondancached on fe.-
cached on session: Setiap sesi memiliki writer dan reader sendiri. Mode ini memberikan throughput lebih tinggi per sesi tetapi memiliki startup yang lebih lambat, karena writer dan reader memerlukan inisialisasi sebelum operasi pertama pada setiap tabel. -
cached on fe: Semua sesi pada node FE berbagi writer dan reader. Writer dan reader tidak ditutup ketika sesi berakhir, sehingga menghilangkan waktu startup.
off
N/A.
hg_experimental_disable_fixed_planner_conflict_pk_check
Mengontrol apakah
dalam sintaks INSERT INTO <table_name> VALUES (...) ON CONFLICT(<column>)dapat berupa kolom non-primary key.-
false: Tidak didukung.
-
true: Didukung.
CatatanJika parameter GUC ini diatur ke
true, Anda dapat menentukan kolom non-primary key. Namun, pernyataan INSERT ON CONFLICT tetap memproses data berdasarkan apakah primary key diduplikasi, seolah-olahON CONFLICT(pk)yang ditentukan.
false
-
Pada versi Hologres dari V1.3 hingga V2.1.28, kolom yang ditentukan dalam
ON CONFLICT(<column>)harus merupakan kolom primary key. -
Parameter ini hanya tersedia di Hologres V2.1.29 dan rilis V2.1.x selanjutnya. Parameter ini mengontrol apakah kolom dalam
ON CONFLICT(<column>)dapat berupa non-primary key. Parameter ini dihapus di V3.0 dan versi selanjutnya, sehingga tidak diperlukan konfigurasi.
-
-
Menggunakan parameter GUC
-
Memeriksa pengaturan parameter GUC
Gunakan perintah
SHOWuntuk memeriksa pengaturan parameter GUC.SHOW <GUC_name>;Contoh:
-- Periksa apakah fitur rencana tetap diaktifkan pada tingkat instans. SHOW hg_experimental_enable_fixed_dispatcher; -
Mengatur parameter GUC
-
Mengatur parameter GUC pada tingkat sesi
Anda dapat menggunakan perintah
SETuntuk mengonfigurasi parameter GUC pada tingkat sesi. Pengaturan ini hanya berlaku untuk sesi saat ini dan dibuang ketika sesi ditutup. Kami merekomendasikan menyertakan perintah ini sebelum pernyataan SQL Anda.SET <GUC_name> = <values>;GUC_name menentukan nama parameter GUC, dan values menentukan nilai parameter tersebut.
Contoh:
-- Aktifkan rencana tetap untuk pernyataan INSERT ON CONFLICT multi-baris. SET hg_experimental_enable_fixed_dispatcher_for_multi_values = on; -
Mengatur parameter GUC pada tingkat database
Gunakan perintah
ALTER DATABASE ... SET ...untuk mengatur parameter GUC pada tingkat database. Pengaturan ini berlaku untuk seluruh database. Untuk menerapkan perubahan ke sesi saat ini, Anda harus terhubung ulang. Pengaturan ini tidak berlaku untuk database baru; Anda harus mengonfigurasinya secara manual untuk masing-masing.ALTER DATABASE <db_name> SET <GUC_name> = <values>;db_name menentukan nama database, GUC_name menentukan nama parameter GUC, dan values menentukan nilai parameter tersebut.
Contoh:
-- Aktifkan fitur rencana tetap pada tingkat database. ALTER DATABASE <db_name> SET hg_experimental_enable_fixed_dispatcher = on;
-
-
Persyaratan tipe data
-
Kolom dalam tabel tidak boleh bertipe
MONEYatauMONEY ARRAY. -
Tipe data berikut didukung untuk kolom dalam operasi DML (
INSERT,UPDATE, danDELETE) danSELECT. Untuk pernyataanSELECT, persyaratan ini berlaku baik untuk kolom target maupun kolom dalam klausaWHERE.-
BOOLEAN(alias:BOOL) -
SMALLINT -
INTEGER(alias:INT,INT4) -
BIGINT(alias:INT8) -
FLOAT(alias:FLOAT4) -
DOUBLE PRECISION(alias:FLOAT8) -
CHAR(n) -
VARCHAR(n)(Di Hologres V1.1.79 dan versi selanjutnya,VARCHARdapat menggunakan Rencana Tetap.) -
BYTEA -
JSONdanJSONB -
TEXT(alias:VARCHAR) -
TIMESTAMP WITH TIME ZONE(alias:TIMESTAMPTZ) -
DATE -
TIMESTAMP -
DECIMAL(alias:NUMERIC) -
ROARINGBITMAP -
TIME(didukung di Hologres V2.2 dan versi selanjutnya) -
TIMETZ(didukung di Hologres V2.2 dan versi selanjutnya) -
Tipe array
-
boolean[] -
smallint[] -
int4[] -
int8[] -
float4[] -
float8[] -
char(n)[] -
varchar(n)[] -
text[]
-
-
Skema insert
Mulai dari Hologres V3.2, Anda dapat menggunakan klausa RETURNING dalam pernyataan INSERT yang menggunakan Rencana Tetap untuk menulis ke tabel dengan primary key.
-
Pernyataan insert
Rencana Tetap dapat digunakan dengan pernyataan INSERT berikut.
-- Tulis satu baris. INSERT INTO TABLE(col1,col2,col3..) VALUES(?,?,?..) ON conflict xxx; -- Tulis beberapa baris. INSERT INTO TABLE(col1,col2,col3..) VALUES(?,?,?..),(?,?,?..) ON conflict xxx;Catatan-
Anda dapat menggunakan pernyataan INSERT untuk menulis data ke tabel internal tetapi tidak ke tabel eksternal.
-
Anda dapat menggunakan pernyataan INSERT untuk menulis data ke tabel partisi. Hologres V1.3 dan versi selanjutnya juga mendukung penulisan ke tabel partisi induk.
-
Kata kunci
RETURNINGtidak didukung dalam pernyataan INSERT di versi Hologres sebelum V3.2. Didukung di Hologres V3.2 dan versi selanjutnya.
-
-
INSERT ON CONFLICT satu baris
-
Skenario berikut didukung:
-
Pernyataan INSERT tanpa klausa
ON CONFLICT. -
Pernyataan INSERT dengan klausa
ON CONFLICT DO NOTHING. -
Pernyataan INSERT dengan klausa
ON CONFLICT DO UPDATE. Untuk menggunakan Rencana Tetap, Anda harus memperbarui semua kolom non-primary key (non-PK) yang ditentukan dalam pernyataan INSERT. Anda dapat secara opsional memperbarui kolom primary key (PK). Pembaruan harus menggunakan formatcol = excluded.col. Di Hologres V1.3 dan versi selanjutnya, Anda dapat memperbarui subset kolom non-PK, tetapi formatcol = excluded.coltetap diperlukan.
-
-
Contoh:
BEGIN; CREATE TABLE test_insert_oneline ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); COMMIT; -- Perbarui semua kolom non-PK. Rencana Tetap dapat digunakan. 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 PK dan non-PK. Rencana Tetap dapat digunakan. 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; -- Rencana Tetap mensyaratkan pembaruan semua kolom non-PK yang ditentukan dalam pernyataan INSERT. Karena col2 dihilangkan, pernyataan ini hanya didukung di Hologres V1.3 dan versi selanjutnya. INSERT INTO test_insert_oneline VALUES (1, 2, 3, 4) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1; -- Rencana Tetap tidak didukung karena pembaruan menggunakan nilai literal alih-alih format 'col = excluded.col' yang diperlukan. INSERT INTO test_insert_oneline VALUES (1, 2, 3, 4) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1, col2 = 5;
-
-
INSERT ON CONFLICT multi-baris
-
Untuk operasi INSERT ON CONFLICT multi-baris, gunakan sintaks 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;. Di Hologres V1.3.35 dan versi selanjutnya, parameter ini diatur keonsecara default. -
Operasi ini tidak menjamin atomisitas. Operasi yang berhasil menulis semua baris. Jika terjadi kesalahan, beberapa atau tidak ada baris yang mungkin telah ditulis.
-
-
Atau, Anda dapat menggunakan sintaks berikut untuk menulis beberapa baris:
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;. -
Anda tidak dapat menulis data ke kolom bertipe array.
-
Array dalam fungsi
unnestharus secara eksplisit di-cast ke tipe array kolom yang sesuai.
Contoh:
BEGIN; CREATE TABLE test_insert_multiline ( pk1 int8, col1 float4, PRIMARY KEY (pk1) ); COMMIT; -- Rencana Tetap 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 fungsi unnest tidak di-cast secara eksplisit. Rencana Tetap 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, jadi array harus di-cast ke int8[]. -- Dalam contoh ini, di-cast ke int4[], sehingga Rencana Tetap 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; -
-
-
Skema pembaruan parsial
Hologres mendukung pembaruan kolom tertentu dari tabel dengan menggunakan primary key. Rencana Tetap juga dapat digunakan untuk pembaruan parsial jika kondisi berikut terpenuhi:
-
Jumlah dan urutan kolom dalam daftar INSERT harus sesuai dengan daftar UPDATE.
-
Pembaruan harus menggunakan format
col = excluded.col.
-
-
UPSERT kondisional
Untuk menangani data upstream yang tidak berurutan untuk baris dengan primary key yang sama, Hologres menyediakan fitur yang mirip dengan operasi HBase CheckAndPut. Anda dapat menggunakan Rencana Tetap untuk pernyataan
INSERTatauUPDATEdengan klausa kondisional jika kondisi berikut terpenuhi:-
Fitur ini didukung untuk insert satu baris. Untuk insert multi-baris, Anda harus mengatur parameter GUC
set hg_experimental_enable_fixed_dispatcher_for_multi_values=on;. -
Klausa
WHEREhanya boleh berisi satu kolom non-PK, dan operator perbandingan harus salah satu dari berikut:=, <>, >, >=, <, <=, IS NULL, atau IS NOT NULL. Anda dapat menggunakan fungsicoalescepada kolom non-PK ini.
Contoh:
BEGIN; CREATE TABLE test_check_and_insert ( pk INT, col INT, scn INT, PRIMARY KEY (pk) ); COMMIT; -- Rencana Tetap didukung. -- Bandingkan 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; -- Bandingkan nilai kolom yang ada dengan nilai baru yang dimasukkan. 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; -- Rencana Tetap didukung. SET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON; -- Bandingkan 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
Anda dapat menggunakan Rencana Tetap untuk menulis ke tabel yang berisi kolom dengan nilai DEFAULT jika kondisi berikut terpenuhi:
-
Fitur ini didukung untuk insert satu baris. Untuk insert multi-baris, instans Hologres Anda harus V1.1.36 atau versi yang lebih baru. Jika instans Anda versi sebelumnya, lakukan peningkatan. Anda juga harus mengatur parameter GUC
set hg_experimental_enable_fixed_dispatcher_for_multi_values=on;. -
Versi Hologres V1.3 dan selanjutnya mendukung Rencana Tetap untuk klausa
Insert on conflictpada tabel yang memiliki kolom Default. Di instans versi sebelumnya, Rencana Tetap tidak didukung untuk klausaInsert on conflictpada tabel yang memiliki kolom Default.
Contoh:
BEGIN; CREATE TABLE test_insert_default ( pk1 INT, col1 INT DEFAULT 99, PRIMARY KEY (pk1) ); COMMIT; -- Rencana Tetap didukung. INSERT INTO test_insert_default (pk1) VALUES (1); -- Ini memerlukan Hologres V1.1.36 atau 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
Anda dapat menggunakan Rencana Tetap untuk penulisan satu baris atau multi-baris ke tabel dengan kolom SERIAL auto-increment jika kondisi berikut terpenuhi:
-
Anda harus mengatur parameter GUC
set hg_experimental_enable_fixed_dispatcher_autofill_series=on;. Di Hologres V1.3.25 dan versi selanjutnya, nilai default parameter ini adalahon. -
Untuk insert multi-baris, Anda juga harus mengatur parameter GUC
set hg_experimental_enable_fixed_dispatcher_for_multi_values=on;.
Contoh:
BEGIN; CREATE TABLE test_insert_serial ( pk1 INT, col1 SERIAL, PRIMARY KEY (pk1) ); COMMIT; -- Rencana Tetap didukung. SET hg_experimental_enable_fixed_dispatcher_autofill_series = ON; INSERT INTO test_insert_serial (pk1) VALUES (1); -- Rencana Tetap 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); -
Skema update
-
Pernyataan UPDATE
Pernyataan
UPDATEdengan klausa berikut dapat menggunakan rencana tetap.SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE TABLE SET col1 = ?,col2 = ? WHERE pk1 = ? AND pk2 = ?; -
Catatan penggunaan
Pernyataan
UPDATEdapat menggunakan rencana tetap jika kondisi berikut terpenuhi:-
Anda dapat memperbarui tabel internal dan tabel partisi anak, tetapi tidak tabel eksternal atau tabel partisi induk. Tabel harus memiliki primary key (PK).
-
Anda harus menjalankan perintah
SET hg_experimental_enable_fixed_dispatcher_for_update = ON;. Mulai dari Hologres V1.3.25, parameter ini sudah tidak digunakan lagi. PernyataanUPDATEyang memenuhi syarat secara otomatis menggunakan rencana tetap. Namun, untuk memperbarui beberapa baris sekaligus, Anda harus menjalankan perintahSET hg_experimental_enable_fixed_dispatcher_for_multi_values = ON;. -
Kolom yang ditentukan dalam klausa
SETtidak boleh merupakan kolom primary key. -
Klausa
WHEREharus menentukan semua kolom primary key. Di Hologres V1.3 dan versi selanjutnya, kondisi terakhir dalam klausaWHEREdapat berada pada kolom non-primary key dan dapat menggunakan operator perbandingan=, <>, >, >=, <, <=, IS NULL, dan IS NOT NULLatau fungsicoalesce. -
Anda dapat menggunakan
pk in (?,?,?) or pk = ANY(...)untuk memperbarui beberapa baris dalam satu pernyataan. Misalnya,pk1 in (1,2) and pk2 = any('{3,4}') and pk3 = 5memperbarui empat baris:(1,3,5), (1,4,5), (2,3,5), dan (2,4,5). -
Setiap kolom dalam klausa
WHEREhanya boleh memiliki satu kondisi. Kondisi identik dianggap sebagai satu kondisi.
Contoh:
BEGIN; CREATE TABLE test_update ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); COMMIT; -- Rencana tetap didukung. SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 = 3 AND pk2 = 4; -- Rencana tetap didukung. SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1 WHERE pk1 = 3 AND pk2 = 4; -- Rencana tetap didukung (Hologres V1.3+, klausa WHERE dengan kolom non-primary key). SET hg_experimental_enable_fixed_dispatcher_for_update = ON; UPDATE test_update SET col1 = 1 WHERE pk1 = 3 AND pk2 = 4 AND col1 > 3; -- Rencana tetap didukung (Hologres V1.3+, klausa WHERE dengan kolom non-primary key 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; -- Rencana tetap 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}'); -- Rencana tetap didukung (Hologres V1.3+, klausa WHERE dengan kolom non-primary key). 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; -- Rencana tetap tidak didukung (beberapa kondisi pada pk1). UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 = 3 AND pk1 = 4; -- Rencana tetap tidak didukung (beberapa kondisi pada pk1). UPDATE test_update SET col1 = 1, col2 = 2 WHERE pk1 IN (1, 2) AND pk1 = 1; -- Rencana tetap didukung (beberapa kondisi identik pada pk1). 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 Penghapusan
-
Pernyataan DELETE
Pernyataan berikut menunjukkan cara menggunakan rencana tetap untuk operasi
DELETE:SET hg_experimental_enable_fixed_dispatcher_for_delete = ON; DELETE FROM TABLE WHERE pk1 = ? AND pk2 = ? AND pk3 = ?; -
Catatan penggunaan
Operasi
DELETEdapat menggunakan rencana tetap jika memenuhi kondisi berikut:-
Operasi harus menargetkan tabel internal atau tabel anak, bukan tabel eksternal atau tabel partisi induk. Tabel juga harus memiliki primary key (PK).
-
Anda harus mengatur parameter GUC
hg_experimental_enable_fixed_dispatcher_for_delete=on;. Di Hologres V1.3.25 dan versi selanjutnya, parameter ini sudah tidak digunakan lagi. PernyataanDELETEyang memenuhi syarat menggunakan rencana tetap secara default. Namun, untuk menghapus beberapa baris, Anda harus menjalankan perintahset hg_experimental_enable_fixed_dispatcher_for_multi_values =on. -
Klausa
WHEREharus menentukan kondisi untuk semua kolom primary key. Mulai dari Hologres V1.3, kondisi terakhir dalam klausaWHEREdapat diterapkan pada bidang non-primary key, yang mendukung operator perbandingan=, <>, >, >=, <, <=, IS NULL, dan IS NOT NULL, serta fungsicoalesce. -
Anda dapat menggunakan
pk in (?,?,?) or pk = ANY()untuk menghapus beberapa baris dalam satu operasi. Misalnya,pk1 in (1,2) and pk2 = any('{3,4}') and pk3 = 5menghapus empat baris:(1,3,5), (1,4,5), (2,3,5), dan (2,4,5). -
Setiap kolom hanya boleh memiliki satu kondisi dalam klausa
WHERE. Kondisi duplikat dianggap sebagai satu kondisi.
Contoh:
BEGIN; CREATE TABLE test_delete ( pk1 INT, pk2 INT, col1 INT, col2 INT, PRIMARY KEY (pk1, pk2) ); COMMIT; -- Pernyataan DELETE ini menggunakan rencana tetap. Untuk skenario lainnya, lihat contoh untuk pernyataan UPDATE. SET hg_experimental_enable_fixed_dispatcher_for_delete = ON; DELETE FROM test_delete WHERE pk1 = 1 AND pk2 = 2; -
Skenario SELECT
-
Pernyataan SELECT
Rencana tetap didukung untuk pernyataan SELECT yang berisi klausa tertentu.
SELECT col1, col2, col3, ... FROM TABLE WHERE pk1 = ? AND pk2 = ? AND pk3 = ?;-
Kueri harus menargetkan tabel internal, bukan tabel eksternal.
-
Kueri harus menargetkan tabel partisi anak, bukan tabel partisi induk.
-
Tabel harus memiliki primary key (PK).
-
-
Skema kueri titik (key/value)
Kondisi berikut berlaku untuk kueri titik yang menggunakan rencana tetap.
-
Klausa
WHEREharus berisi semua dan hanya kolom primary key. -
Anda dapat menggunakan
pk in (?,?,?) or pk = ANY()untuk mengkueri beberapa baris sekaligus. Misalnya,pk1 in (1,2) and pk2 = any('{3,4}') and pk3 = 5mengkueri empat baris:(1,3,5),(1,4,5),(2,3,5),(2,4,5). -
Setiap kolom hanya boleh memiliki satu kondisi. Kondisi duplikat dianggap sebagai satu.
-
Jika klausa
LIMITdisertakan, nilainya harus>0.
Contoh:
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; --Rencana tetap didukung untuk kueri ini. SELECT * FROM test_select WHERE pk1 = 1 AND pk2 = 2; -
-
Skenario PrefixScan
-
Klausa PrefixScan
PrefixScan berlaku untuk kueri pada tabel dengan primary key komposit. Kueri ini menggunakan prinsip pencocokan prefiks paling kiri untuk memfilter pada prefiks kolom primary key. Kode berikut menunjukkan contoh klausa tersebut:
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 Hologres V1.1.48, kolom terakhir dari prefiks PK dapat berupa kondisi rentang. SELECT col1,col2,col3,... FROM TABLE WHERE pk1 = ? AND pk2 BETWEEN ? AND ?;--Mulai dari Hologres V1.1.48, kolom terakhir dari prefiks PK dapat berupa kondisi rentang. -
Penggunaan PrefixScan
Kondisi berikut harus dipenuhi untuk menggunakan PrefixScan:
-
Parameter GUC
hg_experimental_enable_fixed_dispatcher_for_scan=on;harus diatur, dan instans Hologres harus 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 primary key. Di Hologres V1.1.48 dan versi selanjutnya, kondisi rentang (dengan batas atas dan bawah) juga dapat ditentukan untuk kolom terakhir dari prefiks primary key.CatatanDefinisi prefiks: Jika primary key adalah
(pk1,pk2,pk3), maka(pk1)dan (pk1,pk2) adalah prefiksnya. -
Hanya tabel berorientasi baris dan tabel hibrida baris-kolom yang mendukung PrefixScan.
-
Setiap kolom hanya boleh memiliki satu kondisi. Kondisi duplikat dianggap sebagai satu.
-
Jika klausa
LIMITdisertakan, nilainya harus > 0.
CatatanPrefixScan mengembalikan semua baris hasil sekaligus. Jika ukuran byte total hasil melebihi nilai
hg_experimental_fixed_scan_bytesize_limit, kesalahan dikembalikan:scan result size larger than fixed scan size limit. Anda dapat mengonfigurasi parameterhg_experimental_fixed_scan_bytesize_limitke nilai yang sesuai untuk skenario Anda. Nilai default adalah 1.048.576 (1 MB).Sebagai contoh, asumsikan primary key tabel adalah
(pk1,pk2,pk3,pk4)dan kunci distribusinya 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 kolom kunci distribusi. Rencana tetap tidak dapat digunakan. SELECT * FROM test_select_prefix WHERE pk1 = ? AND pk2 = ?; --Bukan prefiks dari primary key. Rencana tetap tidak dapat digunakan. SELECT * FROM test_select_prefix WHERE pk1 = ? AND pk3 = ?; --Rencana tetap dapat digunakan. 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 baris sekaligus, seperti yang ditunjukkan pada contoh berikut.pk1 IN (1,2) AND pk2 = 3 --Setara dengan memindai dua kelompok kunci: (1,3) dan (2,3). pk2 =any('{3,4}') AND pk1 IN (1,2) --Setara dengan memindai empat kelompok kunci: (1,3), (1,4), (2,3), dan (2,4). -
-
Contoh penggunaan
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); --Rencana tetap didukung. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 = 2; --Rencana tetap didukung. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = 1 AND pk2 IN (2, 3); --Rencana tetap didukung. SET hg_experimental_enable_fixed_dispatcher_for_scan = ON; SELECT * FROM test_scan WHERE pk1 = ANY ('{3,4}') AND pk2 IN (2, 3); --Rencana tetap didukung. Kolom terakhir dari PK adalah kondisi rentang. Memerlukan Hologres V1.1.48 atau 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; --Rencana tetap didukung. Kolom terakhir dari PK adalah kondisi rentang. Memerlukan Hologres V1.1.48 atau 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 kolom kunci distribusi. Rencana tetap tidak didukung. SELECT * FROM test_scan WHERE pk1 = 1; --Tidak sesuai dengan prefiks primary key. Rencana tetap tidak didukung. SELECT * FROM test_scan WHERE pk2 = 2;
-
-
Skema pagination
Di Hologres V3.2 dan versi selanjutnya, rencana tetap mendukung kueri PrefixScan yang menggunakan pagination.
Catatan-
Secara default, hasil PrefixScan diurutkan dalam urutan ascending primary key. Dalam contoh SQL berikut, PrefixScan pada
pk1danpk2mengembalikan hasil yang diurutkan dalam urutan ascendingpk3. -
Untuk menentukan urutan pengurutan, Anda dapat menentukan urutan kolom dalam kunci pengelompokan dan mengatur parameter GUC yang sesuai dalam kueri Anda, yang mengurutkan hasil sesuai dengan kunci pengelompokan. Kolom-kolom kunci pengelompokan harus identik dengan kolom-kolom primary key. Dalam contoh SQL berikut, untuk mengurutkan hasil dalam urutan descending, Anda dapat mengatur kolom terakhir kunci pengelompokan menjadi
pk3:desc.
-
Urutan ascending
-- Buat 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' ); -- Masukkan data. INSERT INTO test_scan VALUES (1,2,3,4),(1,2,5,6),(1,2,7,8); -- `offset + limit` didukung. Berdasarkan PrefixScan, kueri ini mengembalikan jumlah baris tertentu mulai dari offset 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; -
Urutan descending
-- Buat 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' ); -- Masukkan data. INSERT INTO test_scan VALUES (1,2,3,4),(1,2,5,6),(1,2,7,8); -- Aktifkan kedua parameter GUC berikut untuk mengurutkan hasil 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;
-
Skema COPY
Mulai dari Hologres V1.3.17, pernyataan COPY dapat menggunakan rencana tetap, fitur yang dikenal sebagai Fixed Copy. Untuk perbandingan antara COPY dan Fixed Copy, lihat Praktik terbaik untuk penulisan batch.
Untuk informasi lebih lanjut tentang parameter Fixed Copy, lihat COPY. Berikut adalah contohnya:
COPY table_name (column0, column1, column2)
FROM
STDIN WITH (
format BINARY,
stream_mode TRUE,
on_conflict UPDATE);
Ketika Anda menghilangkan kolom dalam pernyataan COPY, perilakunya adalah sebagai berikut:
-
Jika pernyataan
COPYmenentukan subset kolom tabel, itu melakukan pembaruan parsial. Contohnya: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 kolom yang dihilangkan memiliki nilai default, pernyataan
COPYberperilaku 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 ID tidak ada, baris baru dimasukkan, dan kolom age diatur ke nilai default-nya. -- Jika ID sudah ada, baris diperbarui, dan kolom age tetap tidak berubah. INSERT INTO t0 (id, name, age) VALUES (?, ?, DEFAULT) ON CONFLICT (id) DO UPDATE SET id = excluded.id, name = excluded.name;
Ekspresi dalam Rencana Tetap
Mulai dari Hologres V3.2, fitur Rencana Tetap mendukung ekspresi dalam pernyataan SQL. Untuk informasi lebih lanjut tentang ekspresi di PostgreSQL, lihat Expressions. Skema yang didukung meliputi:
-
Pernyataan INSERT:
-
Klausa VALUES
-
Klausa INSERT ON CONFLICT DO UPDATE
-
Kondisi filter dalam klausa INSERT ON CONFLICT WHERE
-
Klausa RETURNING
-
-
Pernyataan SELECT:
Daftar SELECT
Batasan
-
Hanya ekspresi dan fungsi skalar yang didukung. Fungsi agregat, fungsi jendela, dan subkueri tidak didukung.
-
Untuk pernyataan INSERT, ekspresi dan fungsi yang digunakan dalam klausa selain klausa VALUES harus didukung oleh HQE.
-
Untuk pernyataan SELECT, Rencana Tetap hanya mendukung ekspresi dan fungsi IMMUTABLE yang menerima argumen konstan.
-
Untuk menggunakan fitur ini, Anda harus mengaktifkan parameter berikut:
-- Aktifkan pada tingkat sesi SET hg_experimental_enable_fixed_plan_expression = on; -- Aktifkan pada tingkat database ALTER DATABASE <db_name> SET hg_experimental_enable_fixed_plan_expression = on;
Contoh
-
Menggunakan ekspresi dalam empat klausa yang didukung dari pernyataan INSERT
-- Buat 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; -- Gunakan ekspresi dalam klausa VALUES. INSERT INTO test_t VALUES (1, 1, now()); -- Gunakan ekspresi dalam klausa ON CONFLICT DO UPDATE. INSERT INTO test_t AS old VALUES (1, 1, now()) ON CONFLICT (id) DO UPDATE SET col = excluded.col + old.col, ts = excluded.ts; -- Gunakan ekspresi dalam klausa ON CONFLICT WHERE. 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; -- Gunakan ekspresi dalam klausa RETURNING. 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; -
Menggunakan ekspresi dalam daftar SELECT dari pernyataan SELECT
-
Kueri titik menggunakan primary key lengkap: Contoh ini mengekstrak nilai kunci dari kolom JSONB.
-- Buat tabel. CREATE TABLE test_t ( id int PRIMARY KEY, ts TIMESTAMP NOT NULL, col JSONB ) WITH ( orientation = 'row', distribution_key = 'id' ); -- Gunakan ekspresi dalam daftar SELECT. Operator JSONB didukung. SELECT (col ->> 'b')::int + (col ->> 'a')::int, date_trunc('day', ts) FROM test_t WHERE id = 1; -
PrefixScan menggunakan prefiks primary key.
-- Buat 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; -- Gunakan ekspresi dalam daftar SELECT. SELECT (col ->> 'b')::int + (col ->> 'a')::int, date_trunc('day', ts) FROM test_t WHERE id = 1;
-
-
Pernyataan SELECT tidak dapat dioptimalkan oleh Rencana Tetap jika berisi fungsi non-IMMUTABLE atau fungsi yang tidak menerima argumen konstan.
-- Buat tabel. CREATE TABLE test_t ( id INT PRIMARY KEY, ts TIMESTAMP NOT NULL, col JSONB ) WITH ( orientation = 'row', distribution_key = 'id' ); -- Fungsi random() tidak immutable dan tidak didukung oleh Rencana Tetap. SELECT id + random() FROM test_t WHERE id = 1; -- Fungsi toString tidak menerima argumen konstan dan tidak didukung oleh Rencana Tetap. SELECT toString (id) FROM test_t WHERE id = 1;
Memverifikasi rencana tetap
-
Di Konsol, pernyataan
INSERT,UPDATE, danDELETEyang dieksekusi menggunakan rencana tetap muncul sebagai tipe SDK di panel Impor Real-time (RPS). Kami merekomendasikan menggunakan rencana tetap untuk operasi penulisan real-time ini untuk meningkatkan efisiensi pembaruan data.
-
Untuk melihat rencana eksekusi SQL, jalankan pernyataan
EXPLAIN. Jika rencana eksekusi yang dikembalikan berisiFixedXXXNode, rencana tetap telah dipicu, seperti yang ditunjukkan pada gambar berikut. Jika rencana eksekusi tidak berisiFixedXXXNode, tinjau kembali kondisi dukungan yang dijelaskan pada bagian sebelumnya dan verifikasi bahwa pernyataan Anda memenuhi persyaratan.
Tuning performa
Jika Anda masih perlu melakukan tuning performa dengan rencana tetap diaktifkan, Anda dapat menggunakan metode berikut.
-
Analisis rencana eksekusi untuk mengidentifikasi bottleneck performa. Jalankan
EXPLAINpada pernyataan SQL untuk melihat waktu yang dikonsumsi pada setiap tahap dan menemukan bottleneck. -
Versi Hologres 1.1.49 dan selanjutnya dioptimalkan untuk kueri titik yang menggunakan rencana tetap, meningkatkan throughput lebih dari 30% dalam skenario berskala besar. Untuk mendapatkan manfaat dari peningkatan ini, tingkatkan instans Anda ke V1.1.49 atau versi yang lebih baru.
-
Gunakan batching sisi klien dengan ukuran batch 512 atau kelipatan 512. Holo Client menangani batching secara otomatis.
FAQ
-
Gejala: Saat mencoba menghubungkan ke Hologres, terjadi kesalahan berikut:
role/database does not exist.-
Penyebab: Pengguna atau database yang ditentukan tidak ada.
-
Solusi: Periksa informasi koneksi Anda dan pastikan username dan nama database benar.
Masuk ke Konsol Hologres. Temukan instans target dan klik Manage di kolom Actions. Klik Database Management. Anda kemudian dapat memverifikasi username di halaman Users dan nama database di halaman Database Authorization.
-
-
Gejala: Selama operasi penulisan data, terjadi kesalahan berikut:
the requested table name: xxx (id: xx, version: xx) mismatches the version of the table (id: xx, version: xx) from server.-
Penyebab: Metadata tabel berubah selama operasi penulisan data (misalnya, kolom ditambahkan), yang mengubah versi tabel.
-
Solusi: Bangun kembali koneksi. Rencana tetap kemudian mengambil metadata tabel baru untuk menyelesaikan operasi penulisan.
-