Exécution d’une opération de fusion en spécifiant une liste de colonnes sans utiliser la commande MERGE - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécution d’une opération de fusion en spécifiant une liste de colonnes sans utiliser la commande MERGE

Exécutez la totalité de l’opération de fusion détaillée dans la procédure dans une même transaction. La transaction est annulée en cas d’échec d’une étape. L’utilisation d’une seule transaction réduit aussi le nombre de validations, ce qui permet de gagner du temps et d’économiser des ressources.

Pour exécuter une opération de fusion par spécification d’une liste de colonnes
  1. Placez l’ensemble de l’opération dans un seul bloc de transactions.

    begin transaction; … end transaction;
  2. Créez une table intermédiaire, puis complétez-la avec les données à fusionner, comme illustré dans le pseudocode suivant.

    create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
  3. Mettez à jour la table cible à l’aide d’une jointure interne avec la table intermédiaire.

    • Dans la clause UPDATE, listez explicitement les colonnes à mettre à jour.

    • Effectuez une jointure interne avec la table intermédiaire.

    • Si la clé de distribution est différente de la clé primaire et que la clé de distribution n’est pas mise à jour, ajoutez une jointure redondante sur la clé de distribution. Pour vérifier que la requête utilise une jointure colocalisée, exécutez la requête avec EXPLAIN et recherchez DS_DIST_NONE sur l’ensemble des jointures. Pour plus d'informations, consultez Évaluation du plan de requête

    • Si votre table cible est triée par horodatage, ajoutez un prédicat pour tirer parti des analyses à plage restreinte sur la table cible. Pour plus d’informations, consultez Bonnes pratiques Amazon Redshift pour la conception de requêtes.

    • Si vous n’utilisez pas toutes les lignes de la fusion, ajoutez une clause pour filtrer les lignes que vous ne voulez pas modifier. Par exemple, ajoutez un filtre d’inégalité sur une ou plusieurs colonnes afin d’exclure les lignes qui n’ont pas changé.

    • Placez les opérations de mise à jour, de suppression et d’insertion dans un même bloc de transaction de telle sorte qu’en cas de problème, tout puisse être annulé.

    Par exemple :

    begin transaction; update target set col1 = stage.col1, col2 = stage.col2, col3 = 'expression' from stage where target.primarykey = stage.primarykey and target.distkey = stage.distkey and target.col3 > 'last_update_time' and (target.col1 != stage.col1 or target.col2 != stage.col2 or target.col3 = 'filter_expression');
  4. Supprimez les lignes superflues de la table intermédiaire à l’aide d’une jointure interne avec la table cible. Certaines lignes de la table cible correspondent déjà aux lignes correspondantes de la table intermédiaire, tandis que d’autres ont été mises à jour lors de l’étape précédente. Dans les deux cas, elles ne sont pas nécessaires pour l’insertion.

    delete from stage using target where stage.primarykey = target.primarykey;
  5. Insérez les lignes restantes de la table intermédiaire. Utilisez la même liste de la colonne dans la clause VALUES que celle que vous avez utilisée dans l’instruction UPDATE à l’étape 2.

    insert into target (select col1, col2, 'expression' from stage); end transaction;
  6. Supprimez la table intermédiaire.

    drop table stage;