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
Copy

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');
Copy
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');
Copy

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;
Copy
Sortie Teradata
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a

Copy
Entrée Snowflake
 SELECT
col1 FROM
table1
UNION ALL
SELECT
col1 FROM
table2;
Copy
Sortie Snowflake
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a

Copy

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;
Copy
Sortie Teradata
t2 row 3 a
value 1 ab --> truncated
t2 row 1 a
t2 row 2 a
value 2 ab --> truncated

Copy
Entrée Snowflake
 SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
Copy
Sortie Snowflake
t2 row 3 a
value 1 abcdefghijk --> NOT truncated
t2 row 1 a
t2 row 2 a
value 2 abcdefghijk --> NOT truncated

Copy

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;
Copy
Sortie Snowflake
t2 row 1 a
t2 row 2 a
t2 row 3 a
value 1 ab
value 2 ab

Copy

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');
Copy
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');
Copy

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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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');
Copy
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');
Copy

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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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;
Copy
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

  • CHAR et VARCHAR se 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;
Copy