Anda dapat mengeksekusi pernyataan INSERT untuk memasukkan baris baru ke dalam tabel tertentu. Topik ini menjelaskan cara menggunakan pernyataan INSERT di Hologres.
Sintaksis
Anda dapat memasukkan satu atau beberapa baris yang ditentukan oleh ekspresi nilai, atau nol atau lebih baris yang dikembalikan dari kueri ke dalam sebuah tabel di Hologres. Pernyataan INSERT menggunakan sintaksis berikut:
INSERT INTO <schema>.<table> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}Tabel berikut menjelaskan parameter dalam sintaksis di atas.
Parameter | Deskripsi |
schema | Nama schema tempat tabel berada. |
table | Nama tabel tempat Anda ingin memasukkan data. Jika Anda menggunakan 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 setelahnya, Anda dapat mengeksekusi pernyataan INSERT yang sesuai dengan sintaksis penggunaan fixed plan untuk langsung menulis data ke tabel induk. Untuk informasi selengkapnya, lihat Percepat eksekusi SQL dengan fixed plan. |
column | Nama kolom tempat Anda ingin memasukkan data. Anda dapat membatasi nama kolom dengan menggunakan nama subfield atau subscript array. Jika Anda hanya memasukkan data ke beberapa field dari kolom komposit, field lainnya akan dibiarkan null. |
expression | Ekspresi atau nilai yang diberikan ke kolom yang sesuai. |
query | Pernyataan SELECT yang menyediakan baris-baris yang akan dimasukkan. Untuk informasi selengkapnya mengenai sintaksis pernyataan SELECT, lihat SELECT. |
Pernyataan INSERT hanya mendukung metode penulisan data berikut:
INSERT INTO VALUESINSERT 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 kerja
Mode penyimpanan tabel Hologres mencakup penyimpanan berorientasi baris, penyimpanan berorientasi kolom, dan penyimpanan hibrida baris-kolom. Ketiga mode penyimpanan ini memiliki prinsip penulisan yang sama.
Pernyataan INSERT dieksekusi untuk menulis data ke log write-ahead logging (WAL) dalam mode Append Only dan memperbarui data ke tabel memori secara real time. Hal ini memastikan bahwa data dapat segera dikueri setelah ditulis. Namun, tabel memori memiliki ukuran tetap. Jika tabel memori penuh, Hologres beralih ke tabel memori lainnya dan memicu proses flush asinkron di backend untuk secara bertahap mengosongkan data ke file. File-file tersebut disimpan di Apsara Distributed File System. Selama proses flush, sejumlah besar file kecil dihasilkan. Hologres menggabungkan file-file kecil ini dan mengurutkannya di backend. Proses ini disebut compaction. Untuk mempercepat penulisan data, Hologres menulis data di backend serta melakukan kompresi dan pengurutan data saat compaction asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat secara signifikan selama proses penulisan data. Setelah proses penulisan data dan compaction selesai, penggunaan penyimpanan berkurang.
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 mengosongkan data ke file.
Tabel berorientasi baris: Data dikosongkan ke file berorientasi baris dalam format SST.
Tabel berorientasi kolom: Data dikosongkan ke file berorientasi kolom dalam format ORC.
Tabel hibrida baris-kolom: Data dikosongkan 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 berhasil dikosongkan ke kedua jenis file tersebut. Jika menggunakan penyimpanan hibrida baris-kolom, data disimpan secara duplikat. Hal ini meningkatkan overhead penyimpanan.
Batasan
Jika Anda memasukkan data ke tabel partisi, pastikan data dimasukkan ke tabel anak, bukan ke tabel induk. Nilai field partisi dalam data yang akan dimasukkan harus sama dengan nilai field partisi dari tabel anak tersebut.
Anda dapat menyesuaikan urutan nama kolom yang tercantum. Jika Anda menggunakan pernyataan
INSERT INTO SELECTuntuk memasukkan data, pastikan tipe data kolom yang diperlukan konsisten dengan tipe data kolom yang Anda kueri.
Contoh
Hologres V2.1.17 dan versi setelahnya mendukung Serverless Computing. Untuk skenario seperti impor data offline skala besar, pekerjaan ETL besar, dan kueri volume tinggi pada tabel eksternal, Anda dapat menggunakan Serverless Computing untuk menjalankan tugas-tugas tersebut. Fitur ini menggunakan sumber daya serverless tambahan alih-alih sumber daya instans Anda, sehingga meningkatkan stabilitas instans dan mengurangi kemungkinan terjadinya error kehabisan memori (OOM). Anda tidak perlu menyediakan sumber daya komputasi tambahan untuk instans Anda, dan hanya dikenai biaya berdasarkan tugas yang dijalankan. Untuk informasi selengkapnya mengenai Serverless Computing, lihat Serverless Computing. Untuk petunjuk penggunaan Serverless Computing, lihat Gunakan Serverless Computing.
Masukkan 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[] ); -- Opsional. Kami menyarankan Anda menggunakan fitur Serverless Computing untuk mengimpor data dalam jumlah besar secara offline dan menjalankan pekerjaan ekstrak, transformasi, dan muat (ETL). SET hg_computing_resource = 'serverless'; -- Impor data. 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]); -- Atur ulang konfigurasi. Ini memastikan bahwa sumber daya komputasi tanpa server tidak digunakan untuk pernyataan SQL berikutnya. RESET hg_computing_resource;Masukkan data dari tabel a ke tabel b.
CREATE TABLE holotest2( a int, b bigint, c bool); -- Opsional. Kami menyarankan Anda menggunakan fitur Serverless Computing untuk mengimpor data dalam jumlah besar secara offline dan menjalankan pekerjaan ETL. SET hg_computing_resource = 'serverless'; -- Impor data. INSERT INTO holotest2 (a,b,c) SELECT a,b,c FROM holotest; -- Atur ulang konfigurasi. Ini memastikan bahwa sumber daya komputasi tanpa server tidak digunakan untuk pernyataan SQL berikutnya. RESET hg_computing_resource;Masukkan data ke dalam tabel partisi.
-- Buat tabel induk tanpa primary key dan tabel anaknya di schema public. 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; -- Opsional. Kami menyarankan Anda menggunakan fitur Serverless Computing untuk mengimpor data dalam jumlah besar secara offline dan menjalankan pekerjaan ETL. SET hg_computing_resource = 'serverless'; -- Masukkan data ke tabel anak. INSERT INTO public.hologres_2022 values('2022',1,now(),'a') -- Atur ulang konfigurasi. Ini memastikan bahwa sumber daya komputasi tanpa server tidak digunakan untuk pernyataan SQL berikutnya. RESET hg_computing_resource;
FAQ
Pertanyaan 1: Saat saya menulis data dalam jumlah besar, utilisasi CPU dan penggunaan memori instans mencapai 100%. Hal ini berdampak negatif terhadap penulisan data dan kueri pada instans. Apa yang harus saya lakukan?
Kami menyarankan Anda menggunakan fitur Serverless Computing saat ingin menulis data dalam jumlah besar.
CatatanHologres V2.1.17 dan versi setelahnya mendukung fitur Serverless Computing. Fitur Serverless Computing cocok untuk skenario seperti impor data offline dalam jumlah besar, menjalankan pekerjaan ETL skala besar, atau mengkueri data dalam jumlah besar menggunakan tabel eksternal. Anda dapat menggunakan sumber daya komputasi tanpa server alih-alih sumber daya instans yang telah dialokasikan untuk menjalankan operasi tersebut. Tidak diperlukan alokasi sumber daya komputasi tambahan. Hal ini meningkatkan stabilitas instans dan mengurangi kemunculan error kehabisan memori (OOM). Anda hanya dikenai biaya berdasarkan sumber daya komputasi tanpa server yang digunakan oleh tugas. Untuk informasi selengkapnya mengenai fitur Serverless Computing, lihat Serverless computing. Untuk informasi selengkapnya mengenai cara menggunakan fitur Serverless Computing, lihat Bekerja dengan serverless computing.
Pertanyaan 2: Metrik yang menunjukkan penggunaan penyimpanan meningkat secara signifikan saat saya menulis data, tetapi berkurang setelah data selesai ditulis. Mengapa demikian?
Berdasarkan prinsip penulisan data, untuk mempercepat penulisan data, Hologres menulis data di backend serta melakukan kompresi dan pengurutan data saat compaction asinkron dilakukan. Oleh karena itu, penggunaan penyimpanan meningkat secara signifikan selama proses penulisan data. Setelah proses penulisan data dan compaction selesai, penggunaan penyimpanan berkurang.
Pertanyaan 3: Mengapa latensi meningkat jika beberapa pernyataan
INSERTdieksekusi secara paralel pada tabel yang sama?Jika pernyataan
INSERTdieksekusi pada tabel tanpa menggunakan fixed plan, tabel tersebut akan dikunci. Eksekusi paralel pernyataanINSERTmeningkatkan durasi tunggu kunci, sehingga menyebabkan peningkatan latensi.Pertanyaan 4: Mengapa pesan error
ERROR: no partition of relation "<table_name>" found for rowmuncul saat saya menulis data ke tabel induk?Deskripsi masalah: Muncul pesan error
ERROR: no partition of relation "<table_name>" found for row.Penyebab: Tidak ada tabel anak.
Solusi: Sebelum menulis data, buat tabel anak dengan mengeksekusi pernyataan berikut:
CREATE TABLE <child_table_name> partition of <parent_table_name> for values in (<value>);
Pertanyaan 5: Mengapa pesan error
Currently inserting into parent table is not supportedmuncul saat saya mengimpor data?Deskripsi masalah: Muncul pesan error
Currently inserting into parent table is not supportedsaat saya mengimpor data.Penyebab: Tabel tempat Anda ingin memasukkan data adalah tabel induk. Hologres tidak mengizinkan Anda menulis data ke tabel induk.
Solusi: Buat tabel anak dan tulis data ke tabel anak tersebut.