INSERT OVERWRITE SELECT permet d'écrire des données par lot avec des performances élevées dans les tables AnalyticDB for MySQL en effaçant les données des partitions avant d'y insérer de nouvelles données en masse.
Fonctionnement
L'instruction INSERT OVERWRITE SELECT efface d'abord toutes les données existantes d'une partition, puis y écrit les nouvelles données par lots.
Si la table cible est partitionnée,
INSERT OVERWRITE SELECTne réécrit que les partitions contenant les nouvelles données. Les autres partitions restent inchangées.Si la table cible n'est pas partitionnée,
INSERT OVERWRITE SELECTefface toutes les données existantes de la table, puis écrit les nouvelles données par lots.
Les tâches d'écriture sur une même table s'exécutent séquentiellement (la concurrence est fixée à 1). La concurrence d'écriture par défaut au niveau du cluster est de 2. Ne modifiez pas cette valeur : cela risquerait de dégrader les performances et de surcharger le cluster.
Pour ajuster la concurrence d'écriture, soumettez un ticket au support technique pour évaluation.
Présentation
Caractéristiques principales :
Forte consommation de ressources : exécutez cette opération pendant les heures creuses pour éviter d'impacter les performances du cluster.
Visibilité par lot : les données écrites ne deviennent visibles qu'à la fin de la tâche, de manière atomique.
Réécriture de partition : seules les partitions contenant de nouvelles données sont réécrites.
Création automatique d'index : les index sont construits de manière synchrone lors de l'écriture, ce qui rend la table cible immédiatement interrogeable dès la fin de la tâche.
Cas d'utilisation courants :
Écriture de données au niveau des partitions.
Initialisation des données (écriture complète).
Écriture massive de données à grande échelle. Non recommandé pour les petits volumes de données.
Précautions
N'utilisez pas INSERT OVERWRITE SELECT conjointement avec des méthodes d'écriture en temps réel (telles que INSERT INTO, REPLACE INTO, DELETE et UPDATE) pour écrire simultanément dans la même table. Sinon, les données issues des écritures en temps réel seront perdues.
Syntaxe
INSERT OVERWRITE table_name (column_name[,...])
select_statement
Paramètres
table_name: nom de la table cible.column_name: nom d'une colonne de la table cible.-
select_statement: instruction SELECT.Le type de données de chaque colonne de l'instruction SELECT doit correspondre à celui de la colonne correspondante dans la table cible.
Si le nombre de colonnes dans l'instruction SELECT est supérieur à celui de la table cible, l'opération d'écriture échoue. S'il est inférieur, les colonnes restantes de la table cible sont renseignées avec leurs valeurs par défaut. Si une colonne ne possède aucune valeur par défaut, le système la renseigne avec NULL.
Exemples
Données d'exemple
Préparez des tables de test et des données pour les exemples de réécriture.
-
Créez une table source nommée
test_sourceet une table cible nomméetest_target.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; -
Insérez des données de test dans la table source
test_source.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);
Réécriture des données
-
Insérez des données initiales dans la table
test_target.INSERT OVERWRITE test_target SELECT * FROM test_source WHERE a = 1;Interrogez la table
test_target. La requête renvoie le résultat suivant.+-----+------+ |1 |1 | |1 |2 | |1 |3 | +-----+------+ -
Réécrivez la partition où b=1 dans la table
test_target.INSERT OVERWRITE test_target (a,b) SELECT a,b FROM test_source WHERE a = 2 AND b = 1;Après la réécriture, l'interrogation de
test_targetrenvoie :+-----+------+ |2 |1 | |1 |2 | |1 |3 | +-----+------+ -
Réécrivez les partitions où b=2 et b=3 dans la table
test_target.INSERT OVERWRITE test_target SELECT * FROM test_source WHERE a = 2 AND b >= 2 AND b <= 3;Après la réécriture, l'interrogation de
test_targetrenvoie :+-----+------+ |2 |1 | |2 |2 | |2 |3 | +-----+------+
Écritures asynchrones
Soumettre une tâche
SUBMIT JOB exécute l'opération d'écriture de manière asynchrone en arrière-plan :
SUBMIT JOB
INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
Optimiser les performances d'écriture
Ajoutez l'indicateur /* direct_batch_load=true */ avant l'opération d'écriture pour améliorer les performances tout en réduisant la consommation de ressources :
/* direct_batch_load=true*/
SUBMIT JOB
INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
/* direct_batch_load=true*/ nécessite une version du noyau 3.1.5 ou ultérieure. Si les performances ne s'améliorent pas, soumettez un ticket pour obtenir de l'aide. Pour vérifier la version de votre noyau, consultez la rubrique Afficher les informations de version de l'instance.
Interroger la progression de la tâche
SUBMIT JOB renvoie un job_id. Utilisez-le pour interroger l'état de la tâche :
SHOW JOB STATUS WHERE job='<job_id>';
Un état SUCCEEDED indique que la tâche est terminée.