J'ai essayé d'utiliser la commande COPY pour charger des données dans une nouvelle table dans Amazon Redshift. J'ai même ajouté le paramètre COMPUPDATE OFF. Pourquoi la commande COPY ANALYZE est-elle toujours exécutée ?
Brève description
Avant de créer une table dans Amazon Redshift, sélectionnez le style de distribution de votre table. Si une table ne spécifie pas de style de distribution, elle utilise la distribution AUTO par défaut. La fonction de distribution AUTO d'Amazon Redshift utilise ensuite le processus COPY ANALYZE pour déterminer si la table doit utiliser la distribution EVEN ou ALL.
Remarque : le paramètre COMPUPDATE OFF exécute toujours la commande COPY ANALYZE sur les tables à l'aide d'un style de distribution AUTO. Le paramètre STATUPDATE OFF ne désactive pas ni ne réprime la commande COPY ANALYZE.
Solution
1. Vérifiez le style de distribution actuel d'une table en exécutant SHOW TABLE :
SHOW TABLE [schema_name.]table_name
Remarque : par défaut, Amazon Redshift applique la distribution AUTO si un style de distribution n'est pas spécifié dans l'instruction CREATE TABLE.
2. Si la distribution AUTO est activée, créez une table avec un style de distribution défini. La spécification d'un style de distribution empêche l'exécution de la commande COPY ANALYZE.
L'exemple suivant spécifie un style de distribution EVEN :
create table rs_example_test (id int)diststyle even;
Pour plus d'informations sur les styles de distribution, consultez Utilisation des styles de distribution de données.
3. Utilisez la commande COPY pour charger les données dans votre table, puis ajoutez-les avec les paramètres STATUPDATE OFF.
Remarque : une bonne pratique consiste à utiliser la commande COPY pour charger de grandes quantités de données, au lieu d'utiliser des instructions INSERT distinctes. Cela réduit le risque de problèmes de performances.
4. Exécutez une requête sur la table système SVL_STATEMENTTEXT, puis filtrez par ID de processus (PID) associé à votre session :
select userid, xid, pid, trim(label) as label, starttime, endtime, sequence, trim(type) as type, left(text,60) text from svl_statementtext where pid = 26815 order by xid, starttime, sequence;
La syntaxe ci-dessus vérifie si la commande COPY ANALYZE a été exécutée dans le cadre de la transaction COPY.
Le résultat ressemble à ce qui suit :
userid xid pid label starttime endtime sequence type text
100 78915 26815 default 2019-03-19 14:06:19 2019-03-19 14:06:21 0 QUERY copy rs_test3 from 's3://xxxxx-rs-log/AWSLogs/rs_test2.csv'\
100 78915 26815 default 2019-03-19 14:06:21 2019-03-19 14:06:21 0 UTILITY COMMIT
Cela confirme que la commande COPY ANALYZE ne s'exécute plus dans le cadre de la transaction COPY.
Informations connexes
Utiliser une table intermédiaire pour exécuter une fusion (Upsert)