Anda dapat mengeksekusi pernyataan INSERT untuk menyisipkan baris baru ke dalam tabel tertentu. Topik ini menjelaskan cara menggunakan pernyataan INSERT di Hologres.
Sintaksis
Anda dapat menyisipkan satu atau lebih baris yang ditentukan oleh ekspresi nilai, atau nol atau lebih baris yang dihasilkan dari kueri ke dalam tabel di Hologres. Pernyataan INSERT menggunakan sintaksis berikut:
INSERT INTO <schema>.<table> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}Tabel berikut menggambarkan parameter dalam pernyataan INSERT.
Parameter | Deskripsi |
schema | Nama skema tempat tabel berada. |
tabel | Nama tabel ke dalam mana Anda ingin menyisipkan data. Jika Anda menggunakan Realtime Compute for Apache Flink untuk menulis data ke Hologres, Anda dapat menentukan tabel induk. Data akan secara otomatis ditulis ke tabel anaknya. Di Hologres V1.3 dan versi selanjutnya, Anda dapat mengeksekusi pernyataan INSERT yang sesuai dengan sintaksis penggunaan rencana tetap untuk langsung menulis data ke tabel induk. Untuk informasi lebih lanjut, lihat Mempercepat eksekusi pernyataan SQL dengan menggunakan rencana tetap. |
kolom | Nama kolom ke dalam mana Anda ingin menyisipkan data. Anda dapat memenuhi syarat nama kolom dengan menggunakan nama subbidang atau indeks array. Jika Anda hanya menyisipkan data ke beberapa bidang kolom komposit, bidang lainnya dibiarkan kosong. |
ekspresi | Ekspresi atau nilai yang ditetapkan ke kolom yang sesuai. |
kueri | Pernyataan SELECT yang menyediakan baris yang akan disisipkan. Untuk informasi lebih lanjut tentang sintaksis pernyataan SELECT, lihat SELECT. |
Pernyataan INSERT hanya mendukung metode penulisan data berikut:
insert into values:INSERT INTO holo2mysqltest (cate_id, cate_name) VALUES (3, 'true'), (3, 'fale'), (3, 'trxxue'), (3, 'x'), (4, 'The Dinner Game');insert into select:
insert into test2 select * from test1;
Cara kerjanya
Model penyimpanan tabel Hologres mencakup penyimpanan berorientasi baris, penyimpanan berorientasi kolom, dan penyimpanan hibrida baris-kolom. Ketiga model tersebut berbagi prinsip penulisan yang sama.
pernyataan INSERT dieksekusi untuk menulis data ke log tulis-depan (WAL) dalam mode Append Only dan memperbarui data ke tabel memori secara real-time. Ini memastikan bahwa data terlihat secara real-time. Namun, tabel memori memiliki ukuran tetap. Jika tabel memori penuh, Hologres beralih ke tabel memori baru dan memicu proses flush asinkron di backend untuk secara bertahap menulis ulang data ke file. File-file tersebut disimpan di Pangu. Selama proses flush, sejumlah besar file kecil dihasilkan. Hologres menggabungkan file kecil ini dan mengurutkannya di backend. Proses ini disebut compaction. Untuk mempercepat proses penulisan data, Hologres menulis data di backend, lalu menekan dan mengurutkan data saat compaction asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat secara signifikan selama proses penulisan data. Setelah proses penulisan data dan proses compaction selesai, penggunaan penyimpanan menurun.
Tabel berorientasi baris, tabel berorientasi kolom, dan tabel hibrida baris-kolom menggunakan format indeks yang berbeda untuk tabel memori di memori dan menggunakan proses yang berbeda untuk menulis ulang data ke file.
Tabel berorientasi baris: Data ditulis ulang ke file berorientasi baris dalam format SST.
Tabel berorientasi kolom: Data ditulis ulang ke file berorientasi kolom dalam format ORC.
Tabel hibrida baris-kolom: Data ditulis ulang ke file berorientasi baris dalam format SST dan file berorientasi kolom dalam format ORC. Selama proses flush, konsistensi data dipastikan. Pesan sukses hanya dikembalikan jika data ditulis ulang ke file berorientasi baris dan file berorientasi kolom. Jika penyimpanan hibrida baris-kolom digunakan, data disimpan secara duplikat. Hal ini meningkatkan overhead penyimpanan.
Batasan
Jika Anda menyisipkan data ke tabel induk, pastikan data disisipkan ke tabel anak dari tabel induk. Nilai bidang partisi dalam data yang akan disisipkan harus sama dengan nilai bidang partisi tabel anak.
Anda dapat menyesuaikan urutan daftar nama kolom. Jika Anda menggunakan metode
insert into selectuntuk menyisipkan data, pastikan tipe data kolom yang diperlukan konsisten dengan tipe data kolom yang Anda kueri.
Contoh
Sisipkan data ke tabel internal.
CREATE TABLE holotest ( a int, b bigint, c bool, e decimal(38,10), f text, g timestamp, h timestamptz, i jsonb, j int[] ); INSERT INTO holotest VALUES (1,9223372036854775807,false,123.123456789123,'john','2020-01-01 01:01:01.123456', '2004-10-19 10:23:54+08','{"a":2}',ARRAY[1, 2, 3, 4]);Sisipkan data tabel a ke tabel b.
CREATE TABLE holotest2( a int, b bigint, c bool); INSERT INTO holotest2 (a,b,c) SELECT a,b,c FROM holotest;Sisipkan data ke tabel partisi.
-- Buat tabel induk tanpa kunci utama dan tabel anaknya di skema publik. begin; create table public.hologres_parent( a text, b int, c timestamp, d text ) partition by list(a); call set_table_property('public.hologres_parent', 'orientation', 'column'); create table public.hologres_2022 partition of public.hologres_parent for values in('2022'); create table public.hologres_2021 partition of public.hologres_parent for values in('2021'); create table public.hologres_2020 partition of public.hologres_parent for values in('2020'); commit; -- Sisipkan data ke tabel anak. INSERT INTO public.hologres_2022 values('2022',1,now(),'a')
FAQ
Pertanyaan 1: Mengapa metrik pemantauan penggunaan penyimpanan meningkat secara signifikan ketika saya menulis data tetapi kemudian menurun setelah data ditulis?
Berdasarkan prinsip penulisan data, untuk mempercepat proses penulisan data, Hologres menulis data di backend, lalu menekan dan mengurutkan data saat compaction asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat secara signifikan selama proses penulisan data. Setelah proses penulisan data dan proses compaction selesai, penggunaan penyimpanan menurun.
Pertanyaan 2: Mengapa latensi meningkat jika beberapa pernyataan
INSERTdieksekusi secara paralel pada tabel yang sama?Jika pernyataan
INSERTdieksekusi pada tabel tanpa menggunakan rencana tetap, tabel akan dikunci. Eksekusi paralel pernyataanINSERTmeningkatkan durasi tunggu kunci, mengakibatkan peningkatan latensi.Pertanyaan 3: Mengapa pesan kesalahan
ERROR: no partition of relation "<table_name>" found for rowdikembalikan ketika saya menulis data ke tabel induk?Deskripsi masalah: Pesan kesalahan
ERROR: no partition of relation "<table_name>" found for rowdikembalikan ketika saya menulis data ke tabel induk.Penyebab: Tidak ada tabel anak yang ada.
Solusi: Sebelum Anda menulis data, Anda harus membuat tabel anak dengan mengeksekusi pernyataan berikut:
create table <child_table_name> partition of <parent_table_name> for values in (<value>);
Pertanyaan 4: Mengapa pesan kesalahan
Currently inserting into parent table is not supporteddikembalikan ketika saya mengimpor data?Deskripsi masalah: Pesan kesalahan
Currently inserting into parent table is not supporteddikembalikan ketika saya mengimpor data.Penyebab: Tabel tempat Anda ingin menyisipkan data adalah tabel induk. Hologres tidak mendukung Anda untuk menulis data ke tabel induk.
Solusi: Buat tabel anak untuk menulis data ke tabel anak.