SnowConvert AI - Teradata - Considérations relatives à la migration des données¶
Cette section décrit des considérations importantes lors de la migration de données de Teradata vers Snowflake.
Note
Considérez qu’il s’agit d’un travail en cours.
Lors de la migration des données de Teradata vers Snowflake, il est crucial de prendre en compte les différences fonctionnelles entre les bases de données. Cette page présente les meilleures suggestions pour la migration des données.
Examinez les informations suivantes :
Migration de données UNION ALL¶
Considérations relatives à la migration des données pour UNION ALL.
UNION ALL est un opérateur SQL qui permet de combiner plusieurs ensembles de résultats. La syntaxe est la suivante :
query_expression_1 UNION [ ALL ] query_expression_2
Pour plus d’informations, veuillez consulter la documentation Teradata suivante.
Différences de taille de colonne¶
Même si l’opération est traduite par le même opérateur dans Snowflake, il peut y avoir des différences détaillées dans l’équivalence fonctionnelle. Par exemple, l’union de différentes colonnes qui ont des tailles de colonnes différentes. Teradata tronque les valeurs lorsque la première instruction SELECT contient moins d’espace dans les colonnes.
Comportement de Teradata¶
Note
Même comportement dans les modes de session ANSI et TERA.
Pour cet exemple, l’entrée suivante montrera le comportement de Teradata.
Données de configuration Teradata¶
CREATE TABLE table1
(
col1 VARCHAR(20)
);
INSERT INTO table1 VALUES('value 1 abcdefghijk');
INSERT INTO table1 VALUES('value 2 abcdefghijk');
CREATE TABLE table2
(
col1 VARCHAR(10)
);
INSERT INTO table2 VALUES('t2 row 1 a');
INSERT INTO table2 VALUES('t2 row 2 a');
INSERT INTO table2 VALUES('t2 row 3 a');
Données de configuration Snowflake¶
CREATE OR REPLACE TABLE table1
(
col1 VARCHAR(20)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "10/14/2024" }}'
;
INSERT INTO table1
VALUES ('value 1 abcdefghijk');
INSERT INTO table1
VALUES ('value 2 abcdefghijk');
CREATE OR REPLACE TABLE table2
(
col1 VARCHAR(10)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "10/14/2024" }}'
;
INSERT INTO table2
VALUES ('t2 row 1 a');
INSERT INTO table2
VALUES ('t2 row 2 a');
INSERT INTO table2
VALUES ('t2 row 3 a');
Cas 1 - une seule colonne : UNION ALL pour un colonne varchar (20) sur un colonne varchar (10)¶
SuccessPlaceholder
Dans ce cas, l’équivalence fonctionnelle est la même
Entrée Teradata¶
SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2;
Sortie Teradata¶
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a
Entrée Snowflake¶
SELECT
col1 FROM
table1
UNION ALL
SELECT
col1 FROM
table2;
Sortie Snowflake¶
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a
Cas 2 - une seule colonne : UNION ALL pour un colonne varchar (10) sur un colonne varchar (20)¶
Danger
Dans ce cas, l’équivalence des fonctions n’est pas la même.
Le cas suivant ne montre pas d’équivalence fonctionnelle dans Snowflake. Les valeurs des colonnes doivent être tronquées comme dans l’échantillon de Teradata.
Entrée Teradata¶
SELECT col1 FROM table2
UNION ALL
SELECT col1 FROM table1;
Sortie Teradata¶
t2 row 3 a
value 1 ab --> truncated
t2 row 1 a
t2 row 2 a
value 2 ab --> truncated
Entrée Snowflake¶
SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
Sortie Snowflake¶
t2 row 3 a
value 1 abcdefghijk --> NOT truncated
t2 row 1 a
t2 row 2 a
value 2 abcdefghijk --> NOT truncated
Solution de contournement pour obtenir la même fonctionnalité
Dans ce cas, la taille de la colonne de la table2 est de 10 et celle de la table1 est de 20. Ainsi, la taille de la première colonne de la requête devrait être l’élément permettant de compléter la fonction LEFT() utilisée ici. Plus d’informations sur la fonction Snowflake LEFT HERE.
Entrée Snowflake¶
SELECT col1 FROM table2 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1 FROM table1;
Sortie Snowflake¶
t2 row 1 a
t2 row 2 a
t2 row 3 a
value 1 ab
value 2 ab
Cas 3 - plusieurs colonnes - même taille par table : UNION ALL pour les colonnes varchar (20) sur les colonnes varchar (10)¶
Dans ce cas, il est exigé d’établir de nouvelles données comme suit :
Données de configuration Teradata¶
CREATE TABLE table3
(
col1 VARCHAR(20),
col2 VARCHAR(20)
);
INSERT INTO table3 VALUES('value 1 abcdefghijk', 'value 1 abcdefghijk');
INSERT INTO table3 VALUES('value 2 abcdefghijk', 'value 2 abcdefghijk');
CREATE TABLE table4
(
col1 VARCHAR(10),
col2 VARCHAR(10)
);
INSERT INTO table4 VALUES('t2 row 1 a', 't2 row 1 b');
INSERT INTO table4 VALUES('t2 row 2 a', 't2 row 2 b');
INSERT INTO table4 VALUES('t2 row 3 a', 't2 row 3 b');
Données de configuration Snowflake¶
CREATE OR REPLACE TABLE table3
(
col1 VARCHAR(20),
col2 VARCHAR(20)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "10/14/2024" }}'
;
INSERT INTO table3
VALUES ('value 1 abcdefghijk', 'value 1 abcdefghijk');
INSERT INTO table3
VALUES ('value 2 abcdefghijk', 'value 2 abcdefghijk');
CREATE OR REPLACE TABLE table4
(
col1 VARCHAR(10),
col2 VARCHAR(10)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "10/14/2024" }}'
;
INSERT INTO table4
VALUES ('t2 row 1 a', 't2 row 1 b');
INSERT INTO table4
VALUES ('t2 row 2 a', 't2 row 2 b');
INSERT INTO table4
VALUES ('t2 row 3 a', 't2 row 3 b');
Une fois les nouvelles tables et données créées, la requête suivante peut être évaluée.
Note
Dans ce cas, l’équivalence fonctionnelle est la même
Entrée Teradata¶
select col1, col2 from table3
union all
select col1, col2 from table4;
Sortie Teradata¶
col1 |
col2 |
|---|---|
valeur 1 abcdefghijk |
valeur 1 abcdefghijk |
t2 ligne 3 a |
t2 ligne 3 b |
valeur 2 abcdefghijk |
valeur 2 abcdefghijk |
t2 ligne 1 a |
t2 ligne 1 b |
t2 ligne 2 a |
t2 ligne 2 b |
Entrée Snowflake¶
SELECT
col1, col2 FROM
table3
UNION ALL
SELECT
col1, col2 FROM
table4;
Sortie Snowflake¶
col1 |
col2 |
|---|---|
valeur 1 abcdefghijk |
valeur 1 abcdefghijk |
valeur 2 abcdefghijk |
valeur 2 abcdefghijk |
t2 ligne 1 a |
t2 ligne 1 b |
t2 ligne 2 a |
t2 ligne 2 b |
t2 ligne 3 a |
t2 ligne 3 b |
Cas 4 - colonnes multiples - même taille par table : UNION ALL pour les colonnes varchar (10) par rapport aux colonnes varchar (20)¶
Avertissement
Dans ce cas, l’équivalence des fonctions n’est pas la même.
Entrée Teradata¶
select col1, col2 from table4
union all
select col1, col2 from table3;
Sortie Teradata¶
col1 |
col2 |
|---|---|
t2 ligne 3 a |
t2 ligne 3 b |
valeur 1 ab |
valeur 1 ab |
t2 ligne 1 a |
t2 ligne 1 b |
t2 ligne 2 a |
t2 ligne 2 b |
valeur 2 ab |
valeur 2 ab |
Entrée Snowflake¶
SELECT
col1, col2 FROM
table4
UNION ALL
SELECT
col1, col2 FROM
table3;
Sortie Snowflake¶
col1 |
col2 |
|---|---|
t2 ligne 1 a |
t2 ligne 1 b |
t2 ligne 2 a |
t2 ligne 2 b |
t2 ligne 3 a |
t2 ligne 3 b |
valeur 1 abcdefghijk |
valeur 1 abcdefghijk |
valeur 2 abcdefghijk |
valeur 2 abcdefghijk |
Solution de contournement pour obtenir la même fonctionnalité
Appliquez la taille de la colonne au deuxième SELECT sur les colonnes pour obtenir la même fonctionnalité.
Entrée Snowflake¶
SELECT col1, col2 FROM table4 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1, LEFT(col2, 10) AS col2 FROM table3;
Sortie Snowflake¶
col1 |
col2 |
|---|---|
t2 ligne 1 a |
t2 ligne 1 b |
t2 ligne 2 a |
t2 ligne 2 b |
t2 ligne 3 a |
t2 ligne 3 b |
valeur 1 ab |
valeur 1 ab |
valeur 2 ab |
valeur 2 ab |
Cas 5 - colonnes multiples - tailles différentes par table : UNION ALL pour les colonnes varchar (10) par rapport aux colonnes varchar (20)¶
Dans ce cas, il est exigé d’établir de nouvelles données comme suit :
Données de configuration Teradata¶
CREATE TABLE table5
(
col1 VARCHAR(20),
col2 VARCHAR(12)
);
INSERT INTO table5 VALUES('value 1 abcdefghijk', 'value 1 abcdefghijk');
INSERT INTO table5 VALUES('value 2 abcdefghijk', 'value 2 abcdefghijk');
CREATE TABLE table6
(
col1 VARCHAR(10),
col2 VARCHAR(5)
);
INSERT INTO table6 VALUES('t2 row 1 a', 't2 row 1 b');
INSERT INTO table6 VALUES('t2 row 2 a', 't2 row 2 b');
INSERT INTO table6 VALUES('t2 row 3 a', 't2 row 3 b');
Données de configuration Snowflake¶
CREATE OR REPLACE TABLE table5
(
col1 VARCHAR(20),
col2 VARCHAR(12)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "10/14/2024" }}'
;
INSERT INTO table5
VALUES ('value 1 abcdefghijk', 'value 1 abcd');
INSERT INTO table5
VALUES ('value 2 abcdefghijk', 'value 2 abcd');
CREATE OR REPLACE TABLE table6
(
col1 VARCHAR(10),
col2 VARCHAR(5)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "10/14/2024" }}'
;
INSERT INTO table6
VALUES ('t2 row 1 a', 't2 1b');
INSERT INTO table6
VALUES ('t2 row 2 a', 't2 2b');
INSERT INTO table6
VALUES ('t2 row 3 a', 't2 3b');
Une fois les nouvelles tables et données créées, la requête suivante peut être évaluée.
Note
Dans ce cas, l’équivalence fonctionnelle est la même
Entrée Teradata¶
select col1, col2 from table5
union all
select col1, col2 from table6;
Sortie Teradata¶
col1 |
col2 |
|---|---|
valeur 1 abcdefghijk |
valeur 1 abcd |
t2 ligne 3 a |
t2 3b |
valeur 2 abcdefghijk |
valeur 2 abcd |
t2 ligne 1 a |
t2 1b |
t2 ligne 2 a |
t2 2b |
Entrée Snowflake¶
SELECT
col1, col2 FROM
table5
UNION ALL
SELECT
col1, col2 FROM
table6;
Sortie Snowflake¶
col1 |
col2 |
|---|---|
valeur 1 abcdefghijk |
valeur 1 abcd |
valeur 2 abcdefghijk |
valeur 2 abcd |
t2 ligne 1 a |
t2 1b |
t2 ligne 2 a |
t2 2b |
t2 ligne 3 a |
t2 3b |
Cas 6 - colonnes multiples - tailles différentes par table : UNION ALL pour les colonnes varchar (20), varchar(10) par rapport aux colonnes varchar (10), varchar(5)¶
Avertissement
Dans ce cas, l’équivalence des fonctions n’est pas la même.
Entrée Teradata¶
select col1, col2 from table6
union all
select col1, col2 from table5;
Sortie Teradata¶
col1 |
col2 |
|---|---|
t2 ligne 3 a |
t2 3b |
valeur 1ab |
Valeur |
t2 ligne 1 a |
t2 1b |
t2 ligne 2 a |
t2 2b |
valeur 2 ab |
Valeur |
Entrée Snowflake¶
SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
col1, col2 FROM
table5;
Sortie Snowflake¶
col1 |
col2 |
|---|---|
t2 ligne 1 a |
t2 1b |
t2 ligne 2 a |
t2 2b |
t2 ligne 3 a |
t2 3b |
valeur 1 abcdefghijk |
valeur 1 abcd |
valeur 2 abcdefghijk |
valeur 2 abcd |
Solution de contournement pour obtenir la même fonctionnalité
La colonne de la première SELECT dont la taille est la plus petite est utilisée pour déterminer la taille des colonnes de la deuxième SELECT.
Entrée Snowflake¶
SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
LEFT(col1, 5) as col1, LEFT(col2, 5) AS col2 FROM
table5;
Sortie Snowflake¶
col1 |
col2 |
|---|---|
t2 ligne 3 a |
t2 3b |
valeur 1ab |
Valeur |
t2 ligne 1 a |
t2 1b |
t2 ligne 2 a |
t2 2b |
valeur 2 ab |
Valeur |
Cas 7 - colonnes multiples expression - tailles différentes par table : UNION ALL pour les colonnes varchar (20), varchar(20) par rapport aux colonnes varchar (10), varchar(10)¶
Utilisez l’ensemble de données ici. Une fois les nouvelles tables et données créées, la requête suivante peut être évaluée.
Note
Dans ce cas, l’équivalence fonctionnelle est la même
Entrée Teradata¶
select col1 || col2 from table3
union all
select col1 || col2 from table4;
Sortie Teradata¶
col1 || col2 |
|---|
valeur 1 abcdefghijkvalue 1 abcdefghijk |
t2 ligne 3 at2 ligne 3 b |
valeur 2 abcdefghijkvalue 2 abcdefghijk |
t2 ligne 1 at2 ligne 1 b |
t2 ligne 2 at2 ligne 2 b |
Entrée Snowflake¶
SELECT
col1 || col2 FROM
table3
UNION ALL
SELECT
col1 || col2 FROM
table4;
Sortie Snowflake¶
col1 || col2 |
|---|
valeur 1 abcdefghijkvalue 1 abcdefghijk |
valeur 2 abcdefghijkvalue 2 abcdefghijk |
t2 ligne 1 at2 ligne 1 b |
t2 ligne 2 at2 ligne 2 b |
t2 ligne 3 at2 ligne 3 b |
Cas 8 - colonnes multiples expression - tailles différentes par table : UNION ALL pour les colonnes varchar (20), varchar(20) par rapport aux colonnes varchar (10), varchar(10)¶
Avertissement
Ce cas présente des différences fonctionnelles.
Entrée Teradata¶
select col1 || col2 from table4
union all
select col1 || col2 from table3;
Sortie Teradata¶
col1 || col2 |
|---|
t2 ligne 1 at2 ligne 1 b |
t2 ligne 2 at2 ligne 2 b |
t2 ligne 3 at2 ligne 3 b |
valeur 1 abcdefghijkv |
valeur 2 abcdefghijkv |
Entrée Snowflake¶
SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
col1 || col2 FROM
table3;
Sortie Snowflake¶
col1 || col2 |
|---|
t2 ligne 1 at2 ligne 1 b |
t2 ligne 2 at2 ligne 2 b |
t2 ligne 3 at2 ligne 3 b |
valeur 1 abcdefghijkvalue 1 abcdefghijk |
valeur 2 abcdefghijkvalue 2 abcdefghijk |
Solution de contournement pour obtenir la même fonctionnalité
La somme des tailles des colonnes les moins importantes doit être utilisée dans la fonction LEFT. Par exemple, la colonne la moins volumineuse est varchar(10), de sorte que la limite de la fonction LEFT doit être de 20 (10 + 10).
Avertissement
La somme des premières SELECT si celle-ci est moins grande, elle sera utilisée pour la troncature des valeurs.
Entrée Snowflake¶
SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
LEFT(col1 || col2, 20) FROM
table3;
Sortie Snowflake¶
col1 || col2 |
|---|
t2 ligne 1 at2 ligne 1 b |
t2 ligne 2 at2 ligne 2 b |
t2 ligne 3 at2 ligne 3 b |
valeur 1 abcdefghijkv |
valeur 2 abcdefghijkv |
Autres considérations sur les différences de taille des colonnes¶
CHARetVARCHARse comportent de la même manière.Les colonnes de chiffres peuvent se comporter différemment. Les nombres ne peuvent pas être tronqués, il y a donc un débordement dans l’environnement Teradata. Cette disposition ne s’applique donc pas à ces types de données. Examinez l’exemple suivant :
-- Teradata number sample
CREATE TABLE table11
(
col1 NUMBER(2)
);
INSERT INTO table11 VALUES(10);
INSERT INTO table11 VALUES(10);
CREATE TABLE table12
(
col1 NUMBER(1)
);
INSERT INTO table12 VALUES(1);
INSERT INTO table12 VALUES(1);
INSERT INTO table12 VALUES(1);
-- ERROR! Overflow occurred when computing an expression involving table11.col1
SELECT col1 FROM table12
UNION ALL
SELECT col1 FROM table11;