INSERT INTO di StarRocks berfungsi mirip dengan MySQL, tetapi setiap eksekusi dijalankan sebagai pekerjaan impor independen, bukan sebagai penulisan langsung ke tempatnya. Hasil dikembalikan secara sinkron setelah pernyataan selesai dieksekusi. Fitur ini cocok untuk memuat sejumlah kecil baris guna verifikasi atau menjalankan transformasi extract, transform, and load (ETL) antar tabel StarRocks.
Kasus penggunaan
-
Pemuatan data uji: Masukkan beberapa baris untuk memverifikasi struktur tabel atau perilaku StarRocks sebelum membangun pipeline lengkap.
-
ETL antar tabel StarRocks: Transformasikan data di satu tabel StarRocks dan tulis hasilnya ke tabel lain menggunakan
INSERT INTO SELECT. -
Pemuatan dari tabel eksternal: Petakan tabel MySQL eksternal sebagai tabel eksternal, lalu gunakan
INSERT INTO SELECTuntuk memuat datanya ke dalam tabel internal StarRocks.
INSERT INTO tidak cocok untuk ingestion rutin di lingkungan produksi. Setiap eksekusi menghasilkan versi data baru, dan penyisipan kecil yang sering akan menghasilkan terlalu banyak versi sehingga menurunkan performa kueri. Untuk ingestion streaming atau batch kecil berfrekuensi tinggi, gunakan Stream Load atau Routine Load sebagai gantinya.
Sintaks
INSERT INTO table_name
[ PARTITION (p1, ...) ]
[ WITH LABEL label ]
[ (column [, ...]) ]
[ [ hint [, ...] ] ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
Parameter
| Parameter | Deskripsi |
|---|---|
table_name |
Tabel tujuan. Gunakan format db_name.table_name. |
PARTITION |
Partisi tempat data dimuat. Partisi harus sudah ada di table_name. Pisahkan beberapa nama partisi dengan koma. Jika dihilangkan, data dimuat ke semua partisi. |
label |
Pengenal unik untuk pekerjaan impor dalam suatu database. Tentukan label secara manual daripada mengandalkan label yang dibuat otomatis — jika koneksi terputus akibat error jaringan, label yang diketahui memungkinkan Anda memeriksa hasil pekerjaan tersebut setelahnya. |
column_name |
Kolom tujuan yang akan ditulis. Kolom dapat dicantumkan dalam urutan apa pun. Jika dihilangkan, semua kolom di table_name digunakan. Kolom sumber yang tidak dipetakan ke kolom tujuan harus memiliki nilai default, atau pernyataan akan gagal. Jika tipe kolom berbeda, konversi implisit akan dicoba; jika konversi gagal, error parsing sintaks akan dikembalikan. |
expression |
Ekspresi yang memberikan nilai ke kolom. |
DEFAULT |
Memberikan nilai default kolom tersebut. |
query |
Pernyataan kueri yang set hasilnya ditulis ke tabel tujuan. Semua pernyataan SQL yang didukung oleh StarRocks valid. |
VALUES |
Satu atau beberapa baris data literal. Gunakan hanya untuk verifikasi demo cepat — bukan untuk pengujian atau produksi. Untuk memuat beberapa baris, lebih baik gunakan INSERT INTO SELECT. |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Tabel tujuan di StarRocks
-
Izin yang diperlukan untuk menulis ke tabel tersebut
Siapkan tabel contoh
Contoh dalam topik ini menggunakan database dan tabel berikut. Jalankan pernyataan-pernyataan ini untuk menyiapkannya.
-
Buat database:
CREATE DATABASE IF NOT EXISTS load_test; -
Beralih ke database:
USE load_test; -
Buat tabel tujuan:
CREATE TABLE insert_wiki_edit ( event_time DATETIME, channel VARCHAR(32) DEFAULT '', user VARCHAR(128) DEFAULT '', is_anonymous TINYINT DEFAULT '0', is_minor TINYINT DEFAULT '0', is_new TINYINT DEFAULT '0', is_robot TINYINT DEFAULT '0', is_unpatrolled TINYINT DEFAULT '0', delta INT SUM DEFAULT '0', added INT SUM DEFAULT '0', deleted INT SUM DEFAULT '0' ) AGGREGATE KEY(event_time, channel, user, is_anonymous, is_minor, is_new, is_robot, is_unpatrolled) PARTITION BY RANGE(event_time) ( PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'), PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'), PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'), PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00') ) DISTRIBUTED BY HASH(user) BUCKETS 10 PROPERTIES("replication_num" = "1");
Masukkan baris dengan VALUES
Gunakan INSERT INTO VALUES untuk menulis sejumlah kecil baris literal langsung ke dalam tabel. Ini hanya dimaksudkan untuk verifikasi cepat — bukan untuk produksi atau pengujian performa.
INSERT INTO insert_wiki_edit VALUES
("2015-09-12 00:00:00","#en.wikipedia","GELongstreet",0,0,0,0,0,36,36,0),
("2015-09-12 00:00:00","#ca.wikipedia","PereBot",0,1,0,1,0,17,17,0);
Output yang diharapkan:
Query OK, 2 rows affected (0.29 sec)
{'label':'insert_1f12c916-5ff8-4ba9-8452-6fc37fac2e75', 'status':'visible', 'txnId':'601'}
2 rows affected mengonfirmasi bahwa kedua baris berhasil dimuat. status: visible berarti data tersebut langsung dapat dikueri.
Muat data dengan INSERT INTO SELECT
Gunakan INSERT INTO SELECT untuk memuat data dari tabel StarRocks lain atau menjalankan transformasi ETL sebagai bagian dari proses pemuatan.
Tetapkan label pada pekerjaan agar Anda dapat memeriksa hasilnya meskipun koneksi terputus:
INSERT INTO insert_wiki_edit WITH LABEL insert_load_wikipedia
SELECT * FROM routine_wiki_edit;
Output yang diharapkan:
Query OK, 18203 rows affected (0.40 sec)
{'label':'insert_load_wikipedia', 'status':'visible', 'txnId':'618'}
Periksa status pekerjaan impor
Jika koneksi terputus sebelum hasil dikembalikan, gunakan label untuk memeriksa status pekerjaan. Jalankan pernyataan SHOW LOAD dan gunakan label untuk mengidentifikasi pekerjaan tersebut. URL dalam hasil yang dikembalikan juga dapat digunakan untuk memeriksa data error.
Jika Anda tidak menetapkan label, gunakan label yang dibuat otomatis dari hasil impor untuk menjalankan kueri yang sama.
Pahami nilai kembali
Pernyataan INSERT INTO yang berhasil mengembalikan baris status segera setelah eksekusi. Tabel berikut menjelaskan setiap bidang.
| Bidang | Deskripsi |
|---|---|
rows affected |
Jumlah total baris yang dimuat. |
warnings |
Jumlah baris yang difilter (tidak dimuat). |
label |
Pengenal pekerjaan impor. Dibuat otomatis jika tidak ditentukan dengan WITH LABEL. |
status |
visible: data yang dimuat langsung dapat dikueri. committed: data yang diimpor tidak terlihat. |
txnId |
ID transaksi untuk pekerjaan impor ini. |
err |
Hanya muncul pada error tak terduga. Gunakan SHOW LOAD dengan URL yang dikembalikan untuk memeriksa baris yang difilter. |
Contoh nilai kembali
Tabel sumber kosong — tidak ada baris yang dimuat:
Query OK, 0 rows affected (0.02 sec)
Pemuatan berhasil dengan label otomatis — 4 baris dimuat, data langsung dapat dikueri:
Query OK, 4 rows affected (0.38 sec)
{'label':'insert_8510c568-9eda-4173-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}
Pemuatan berhasil dengan label kustom — hasil sama, label ditentukan pengguna:
Query OK, 4 rows affected (0.38 sec)
{'label':'my_label1', 'status':'visible', 'txnId':'4005'}
Pemuatan sebagian dengan baris yang difilter — 2 baris dimuat, 2 baris difilter karena error format:
Query OK, 2 rows affected, 2 warnings (0.31 sec)
{'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}
Ini juga dapat mengembalikan status: committed, yang berarti data yang diimpor tidak terlihat.
Pemuatan gagal — semua baris ditolak, tidak ada data yang dimuat:
ERROR 1064 (HY000): all partitions have no load data. url: http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2
Buka URL tersebut untuk memeriksa baris yang menyebabkan kegagalan.
Konfigurasi
Parameter node FE
| Parameter | Default | Deskripsi |
|---|---|---|
insert_load_default_timeout_second |
3600 (1 jam) | Timeout untuk semua pekerjaan impor INSERT INTO, dalam satuan detik. Pengaturan ini berlaku secara global — Anda tidak dapat menetapkan timeout berbeda untuk pekerjaan individual. Jika pekerjaan melebihi batas ini, pekerjaan akan dibatalkan dan berpindah ke status CANCELLED. Sesuaikan nilai ini di node frontend (FE) jika pekerjaan Anda terus-menerus mengalami timeout. |
Parameter sesi
| Parameter | Default | Deskripsi |
|---|---|---|
enable_insert_strict |
true |
Mengontrol cara pekerjaan menangani baris yang tidak valid. true: pekerjaan gagal jika ada baris yang difilter. false: pekerjaan berhasil jika setidaknya satu baris dimuat; label dikembalikan meskipun terjadi kegagalan sebagian. Atur dengan SET enable_insert_strict = false. |
query_timeout |
— | Timeout kueri tingkat sesi dalam satuan detik. INSERT INTO tunduk pada timeout ini. Tingkatkan nilainya dengan SET query_timeout = <seconds> jika pekerjaan pemuatan Anda mengalami timeout sebelum mencapai batas timeout tingkat FE. |
Catatan penggunaan
-
Secara default, baris yang tidak sesuai dengan format tabel tujuan (misalnya, string yang melebihi panjang yang dideklarasikan) akan difilter tanpa pemberitahuan. Tetapkan
enable_insert_strict = trueagar pekerjaan gagal alih-alih memfilter baris tersebut. -
Setiap eksekusi
INSERT INTOmenghasilkan versi data baru. Hindari menjalankannya dengan frekuensi tinggi di lingkungan produksi — terlalu banyak versi akan menurunkan performa kueri.
Langkah selanjutnya
-
Stream Load — untuk ingestion throughput tinggi atau streaming
-
Routine Load — untuk ingestion berkelanjutan dari antrian pesan