ApsaraDB for SelectDB, SelectDB tablolarına veri aktarmak için INSERT INTO deyimleri dahil olmak üzere standart SQL sözdizimini destekler. Dahili tablolarda ETL işlemleri çalıştırmak veya harici veri göllerinden veri eşitlemek için INSERT INTO...SELECT kullanın; test ve doğrulama amaçları için ise INSERT INTO...VALUES kullanın.
INSERT INTO Ne Zaman Kullanılır?
INSERT INTO iki farklı varyanta sahiptir. Senaryonuza göre seçim yapın:
| Varyant | Kullanım Durumu | Kaçınılması Gereken Durum |
|---|---|---|
INSERT INTO...SELECT |
Dahili tablolarda ETL çalıştırma, katalog aracılığıyla harici veri göllerinden eşitleme | — |
INSERT INTO...VALUES |
Test ve doğrulama | Üretim ortamları veya büyük veri hacimleri |
INSERT INTO...VALUES düşük yazma aktarım hızına sahiptir. Küçük ancak sık yazma işlemleri içeren üretim iş yükleri için, çok daha yüksek yazma performansı sunan Stream Load kullanın.
Çalışma Mantığı
Her iki varyant da senkron çalışır; deyim yalnızca aktarım tamamlandıktan sonra yanıt döndürür. Her aktarım, benzersiz bir etikete sahip bir işlem oluşturur. Sonuç; etiketi, işlem kimliğini ve veri görünürlük durumunu içerir.
Ön Koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Bir ApsaraDB for SelectDB örneği
SelectDB'de bir hedef tablo
Hedef tablo üzerinde yazma izni
INSERT INTO...SELECT Deyimi
Bu varyantı, zaten SelectDB'de bulunan veriler üzerinde çıkarma, dönüştürme ve yükleme (ETL) işlemleri çalıştırmak veya bir katalog aracılığıyla harici kaynaklardan veri eşitlemek için kullanın.
Dahili Bir Tabloda ETL Çalıştırma
Bir SelectDB tablosundaki verileri dönüştürüp sonuçları başka bir tabloya yazmak için:
INSERT INTO bj_store_sales
SELECT id, total, user_id, sale_timestamp FROM store_sales WHERE region = "bj";
Bu sorgu, store_sales tablosundan region = "bj" koşulunu sağlayan satırları okur ve bunları bj_store_sales tablosuna yazar.
Veri Gölünden Veri Eşitleme
SelectDB katalogları, Hive, Iceberg, Hudi, Elasticsearch ve Java Database Connectivity (JDBC) kaynakları dahil olmak üzere harici veri kaynaklarını eşlemenize ve bunları birleşik sorgularla sorgulamanıza olanak tanır. Bir veri gölünden SelectDB tablosuna veri eşitlemek için katalog kullanın.
Aşağıdaki örnek, bir Hive kaynağından SelectDB'ye veri eşitler.
SelectDB örneğinize bağlanın. Ayrıntılar için bkz. MySQL istemcisi kullanarak bir ApsaraDB for SelectDB örneğine bağlanma.
Hive veri kaynağını entegre etmek için bir katalog oluşturun. Ayrıntılar için bkz. Hive veri kaynağı.
-
(İsteğe bağlı) Bir hedef veritabanı oluşturun. Veritabanı zaten varsa bu adımı atlayın.
CREATE DATABASE hive_db; -
Hedef veritabanına geçin.
USE hive_db; -
Bir hedef tablo oluşturun. Tablo zaten varsa sütun türlerinin kaynak tablo ile eşleştiğini doğrulayın. Tür eşleme referansı için bkz. Sütun veri türü eşlemeleri.
CREATE TABLE test_Hive2SelectDB ( id int, name varchar(50), age int ) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES("replication_num" = "1"); -
(İsteğe bağlı) Aktarmadan önce tabloyu önizleyin.
SELECT * FROM test_Hive2SelectDB;
-
Verileri eşitlemek için INSERT INTO...SELECT deyimini çalıştırın. Aktarım işine
WITH LABELkullanarak benzersiz bir etiket atayın.INSERT INTO test_Hive2SelectDB WITH LABEL test_label SELECT * FROM hive_catalog.testdb.hive_t; -
Verileri doğrulamak için hedef tabloyu sorgulayın. Hedef tablo verileri solda, kaynak veriler sağda gösterilmektedir.

INSERT INTO...VALUES Deyimi
Bu varyantı yalnızca test ve doğrulama amacıyla kullanın, üretim ortamında kullanmayın. Ekleme isteklerini bir SQL istemcisi veya JDBC uygulaması aracılığıyla gönderin.
Öncelikle bir hedef tablo oluşturun:
CREATE TABLE test_table
(
id int,
name varchar(50),
age int
)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES("replication_num" = "1");
SQL İstemcisi Kullanma
Birden çok INSERT INTO deyimini tek bir aktarımda toplu işlem olarak yürütmek için bunları bir işlem içinde gruplayın:
BEGIN;
INSERT INTO test_table VALUES (1, 'Zhang San', 32),(2, 'Li Si', 45),(3, 'Zhao Liu', 23);
INSERT INTO test_table VALUES (4, 'Wang Yi', 32),(5, 'Zhao Er', 45),(6, 'Li Er', 23);
INSERT INTO test_table VALUES (7, 'Li Yi', 32),(8, 'Wang San', 45),(9, 'Zhao Si', 23);
COMMIT;
JDBC Uygulaması Kullanma
Aşağıdaki örnek, JDBC kullanarak tek bir işlemde birden çok INSERT INTO deyimini toplu olarak çalıştırır. Yer tutucu değerleri kendi değerlerinizle değiştirin.
public static void main(String[] args) throws Exception {
// Number of INSERT statements per batch
int insertNum = 10;
// Number of rows per INSERT statement
int batchSize = 10000;
// Replace <host> and <port> with your VPC (virtual private cloud) endpoint values.
// Find these on the Instance Details page under Network Information.
String URL = "jdbc:mysql://<host>:<port>/test_db?useLocalSessionState=true";
Connection connection = DriverManager.getConnection(URL, "admin", "<password>");
Statement statement = connection.createStatement();
statement.execute("BEGIN;");
for (int num = 0; num < insertNum; num++) {
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO test_table VALUES ");
for (int i = 0; i < batchSize; i++) {
if (i > 0) {
sql.append(",");
}
// Replace with your actual field values
sql.append("(1, 'Zhang San', 32)");
}
statement.addBatch(sql.toString());
}
statement.addBatch("COMMIT;");
statement.executeBatch();
statement.close();
connection.close();
}
Aktarım Sonucunu Anlama
INSERT INTO senkron çalışır; sonucu belirlemek için dönüş değerini kontrol edin.
Satır Olmadan Başarılı Aktarım
SELECT yan tümcesi hiçbir satır döndürmezse SelectDB şu yanıtı verir:
INSERT INTO tbl1 SELECT * FROM empty_tbl;
Query OK, 0 rows affected (0.02 sec)
Query OK deyimin hatasız çalıştığını gösterir. 0 rows affected ise hiçbir veri aktarılmadığını belirtir.
Satırlarla Başarılı Aktarım
INSERT INTO tbl1 SELECT * FROM tbl2;
Query OK, 4 rows affected (0.38 sec)
{'label':'insert_8510c568-9eda-****-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}
JSON yanıtı şunları içerir:
| Alan | Açıklama |
|---|---|
label |
Aktarım işi tanımlayıcısı; WITH LABEL ile belirttiğiniz değer veya otomatik oluşturulan bir değerdir. Veritabanı içinde benzersizdir. |
status |
Veri görünürlüğü. visible verilerin sorgulanabilir olduğunu gösterir. committed verilerin yazıldığını ancak henüz görünür olmadığını belirtir. |
txnId |
Bu aktarım için işlem kimliği. |
err |
Beklenmeyen hatalar. |
status değeri committed ise veriler nihayetinde görünür hale gelecektir. Kontrol etmek için:
SHOW TRANSACTION WHERE id=4005;
TransactionStatus değeri visible olarak gösteriliyorsa veriler sorgulanabilir durumdadır.
Filtrelenmiş Satırlarla Başarılı Aktarım
Bazı satırlar filtrelendiyse sonuç bir uyarı sayısı gösterir:
Query OK, 2 rows affected, 2 warnings (0.31 sec)
{'label':'insert_f0747f0e-7a35-****-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}
Filtrelenen satırları incelemek için SHOW LOAD çıktısında etiketi bulun:
SHOW LOAD WHERE label="insert_f0747f0e-7a35-****-affa-13a235f4020d";
Ardından, çıktıdaki URL'yi kullanarak hata ayrıntılarını sorgulayın:
SHOW LOAD WARNINGS ON "<error-url>";
Başarısız Aktarım
Aktarım başarısız olursa hiçbir veri yazılmaz ve SelectDB bir hata döndürür:
INSERT INTO tbl1 SELECT * FROM tbl2 WHERE k1 = "a";
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
Hata mesajındaki URL'yi kullanarak ayrıntılı hata bilgilerini alın:
SHOW LOAD WARNINGS ON "<error-url>";
Yapılandırma Referansı
Oturum Değişkenleri
| Değişken | Varsayılan | Açıklama |
|---|---|---|
query_timeout |
300s (5 dk) | INSERT INTO işlemi için zaman aşımı süresi. Aktarım bu süre içinde tamamlanmazsa SelectDB işlemi iptal eder. |
enable_insert_strict |
true |
true olduğunda, herhangi bir satır filtrelendiyse aktarım başarısız olur. false olduğunda, filtrelenen satırlar sessizce yok sayılır. |
enable_unique_key_partial_update |
false |
true olduğunda, Merge on Write (MOW) kullanan Unique Key model tablolarında kısmi sütun güncellemelerini etkinleştirir. |
Kısmi Sütun Güncellemeleri
Varsayılan olarak INSERT INTO tam satırlar yazar. Merge on Write (MOW) kullanan bir Unique Key model tablosunda yalnızca belirli sütunları güncellemek için:
SET enable_unique_key_partial_update = true;
Bu değişken yalnızca Merge on Write (MOW) modunu kullanan Unique Key model tabloları için geçerlidir.
Hem
enable_unique_key_partial_updatehem deenable_insert_stricttrueise, INSERT INTO yalnızca mevcut satırları güncelleyebilir. Anahtar tabloda yoksa bir hata döndürülür.Hem mevcut sütunları güncellemek hem de yeni satırlar eklemek için
enable_unique_key_partial_update = trueveenable_insert_strict = falseayarlayın. Ayrıntılar için bkz. Değişkenleri yapılandırma.
Değişkenlerin tam listesi için bkz. Değişken yönetimi.
En İyi Uygulamalar
Yüksek frekanslı küçük yazmalardan kaçının. Sık yapılan küçük ekleme işlemleri performansı düşürür ve tablolarda kilitlenmelere neden olabilir. Tek bir tablodaki yazma sıklığını yazma başına 10 saniyenin üzerinde tutun ve birden çok satırı tek bir INSERT INTO deyiminde toplayın.
INSERT INTO...VALUES için toplu iş boyutu. Optimum performans için deyim başına 1.000 ila 1.000.000 satır arasında toplu işlem yapın.
Üretim ortamı veri alımı için Stream Load kullanın. Üretim ortamları ve büyük veri hacimleri için INSERT INTO...VALUES yerine Stream Load kullanın.
İzlenebilirlik için etiket atayın. Aktarım işlerine anlamlı etiketler atamak için WITH LABEL kullanın. Bu, iş durumunu sorgulamayı ve hataları ayıklamayı kolaylaştırır. INSERT INTO deyiminde alt sorguları tanımlamak için ortak tablo ifadelerini (CTE) kullanmak istiyorsanız WITH LABEL ve column belirtmeniz gerekir.
Filtreleme eşiği. INSERT INTO, max_filter_ratio parametresini desteklemez. Varsayılan olarak tüm hatalı satırlar yok sayılır (max_filter_ratio = 1 değerine eşdeğerdir). Veri hatalarına karşı sıfır tolerans uygulamak için enable_insert_strict = true ayarlayın.
Sık Sorulan Sorular
Aktarım sırasında neden get table cloud commit lock timeout hatası oluşur?
Bu durum, aynı tabloya yapılan yazma işlemlerinin çok sık olması ve kilit çekişmesine neden olması durumunda oluşur. Yazma sıklığını azaltın; her tabloya en fazla 5 saniyede bir yazma işlemi gelmesini sağlayın ve birden çok küçük ekleme işlemini daha az sayıda, daha büyük toplu işlerde birleştirin.
Sonraki Adımlar
Stream Load — üretim kullanım durumları için yüksek aktarım hızlı veri alımı
Veri göl ambarı — harici veri kaynaklarını SelectDB ile entegre etme
Değişken yönetimi — INSERT INTO davranışı için oturum değişkenlerini yapılandırma