INSERT OVERWRITE SELECT ifadesi, bölümlerdeki verileri temizleyip yeni verileri toplu olarak yazarak AnalyticDB for MySQL tablolarında yüksek performanslı toplu veri yazma işlemi gerçekleştirir.
Çalışma mantığı
INSERT OVERWRITE SELECT deyimi önce bir bölümdeki tüm mevcut verileri temizler, ardından yeni verileri toplu olarak bu bölüme yazar.
Hedef tablo bölümlenmiş bir tabloyse,
INSERT OVERWRITE SELECTyalnızca yeni verilerin ait olduğu bölümlerin üzerine yazar. Diğer bölümler etkilenmez.Hedef tablo bölümlenmemiş bir tabloyse,
INSERT OVERWRITE SELECTtablodaki tüm mevcut verileri temizler ve ardından yeni verileri toplu olarak yazar.
Tek bir tablo için yazma işleri sırayla çalışır (eşzamanlılık 1 olarak sabittir). Küme düzeyindeki varsayılan yazma eşzamanlılığı 2'dir. Bu değeri değiştirmeyin; performansı düşürebilir ve kümeyi aşırı yükleyebilir.
Yazma eşzamanlılığını ayarlamak için teknik destekten değerlendirme istemek üzere Bir destek talebi oluşturun.
Genel Bakış
Temel özellikler:
Yüksek kaynak tüketimi: Küme performansını etkilememek için yoğun olmayan saatlerde çalıştırın.
Toplu görünürlük: Yazılan veriler yalnızca iş tamamlandıktan sonra tek seferde görünür hale gelir.
Bölüm üzerine yazma: Yalnızca yeni veri içeren bölümlerin üzerine yazar.
Otomatik dizin oluşturma: Dizinler yazma işlemi sırasında senkronize olarak oluşturulur; bu sayede iş tamamlandığında hedef tablo hemen sorgulanabilir duruma gelir.
Yaygın kullanım senaryoları:
Bölüm düzeyinde veri yazma işlemleri.
Veri başlatma (tam veri yazma).
Büyük ölçekli toplu veri yazma işlemleri. Düşük veri hacimleri için önerilmez.
Dikkat edilmesi gerekenler
Aynı tabloya eşzamanlı olarak yazma yapmak için INSERT OVERWRITE SELECT ifadesini ve gerçek zamanlı yazma yöntemlerini (INSERT INTO, REPLACE INTO, DELETE ve UPDATE gibi) birlikte kullanmayın. Aksi takdirde gerçek zamanlı yazma işlemlerinden gelen veriler kaybolur.
Söz dizimi
INSERT OVERWRITE table_name (column_name[,...])
select_statement
Parametreler
table_name: Hedef tablonun adı.column_name: Hedef tablodaki bir sütunun adı.-
select_statement: SELECT ifadesi.SELECT ifadesindeki her sütunun veri türü, hedef tablodaki karşılık gelen sütunun veri türüyle eşleşmelidir.
SELECT ifadesindeki sütun sayısı hedef tablodakinden fazlaysa yazma işlemi başarısız olur. SELECT ifadesindeki sütun sayısı hedef tablodakinden azsa hedef tablodaki kalan sütunlar varsayılan değerleriyle doldurulur. Bir sütunun varsayılan değeri yoksa sistem bu sütunu NULL olarak doldurur.
Örnekler
Örnek veriler
Üzerine yazma örnekleri için test tablolarını ve verilerini hazırlayın.
-
test_sourceadında bir kaynak tablo vetest_targetadında bir hedef tablo oluşturun.CREATE TABLE test_source (a BIGINT, b BIGINT) DISTRIBUTED BY HASH(a);CREATE TABLE test_target (a BIGINT, b BIGINT) DISTRIBUTED BY HASH(a) PARTITION BY VALUE(b) LIFECYCLE 10; -
Kaynak tablo
test_sourceiçine test verilerini yazın.INSERT INTO test_source VALUES (1,1); INSERT INTO test_source VALUES (1,2); INSERT INTO test_source VALUES (1,3); INSERT INTO test_source VALUES (2,1); INSERT INTO test_source VALUES (2,2); INSERT INTO test_source VALUES (2,3);
Verilerin üzerine yazma
-
test_targettablosuna ilk verileri ekleyin.INSERT OVERWRITE test_target SELECT * FROM test_source WHERE a = 1;test_targettablosunu sorgulayın. Sorgu aşağıdaki sonucu döndürür.+-----+------+ |1 |1 | |1 |2 | |1 |3 | +-----+------+ -
test_targettablosunda b=1 olan bölümün üzerine yazın.INSERT OVERWRITE test_target (a,b) SELECT a,b FROM test_source WHERE a = 2 AND b = 1;Üzerine yazma işleminden sonra
test_targetsorgulandığında aşağıdaki sonuç döner:+-----+------+ |2 |1 | |1 |2 | |1 |3 | +-----+------+ -
test_targettablosunda b=2 ve b=3 olan bölümlerin üzerine yazın.INSERT OVERWRITE test_target SELECT * FROM test_source WHERE a = 2 AND b >= 2 AND b <= 3;Üzerine yazma işleminden sonra
test_targetsorgulandığında aşağıdaki sonuç döner:+-----+------+ |2 |1 | |2 |2 | |2 |3 | +-----+------+
Eşzamansız yazma işlemleri
İş gönderme
SUBMIT JOB yazma işlemini arka planda eşzamansız olarak çalıştırır:
SUBMIT JOB
INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
Yazma performansını optimize etme
Daha düşük kaynak tüketimiyle performansı artırmak için yazma işleminden önce /* direct_batch_load=true */ ipucunu ekleyin:
/* direct_batch_load=true*/
SUBMIT JOB
INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
/* direct_batch_load=true*/ çekirdek sürümü 3.1.5 veya üstünü gerektirir. Performans artmazsa yardım almak için Bir destek talebi oluşturun. Çekirdek sürümünüzü kontrol etmek için bkz. Örnek sürüm bilgilerini görüntüleme.
İş ilerlemesini sorgulama
SUBMIT JOB bir job_id döndürür. İş durumunu sorgulamak için bu kimliği kullanın:
SHOW JOB STATUS WHERE job='<job_id>';
SUCCEEDED durumu işin tamamlandığını gösterir.