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

Case 1 - one single column: UNION ALL for a column VARCHAR(20) over a column 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

Case 2 - one single column: UNION ALL for a column VARCHAR(10) over a column VARCHAR(20)

Danger

In this case, the functional equivalence is not the same.

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é

In this case, the size of the column of the table2 is 10 and the table1 is 20. So, the size of the first column in the query should be the element to complete the LEFT() function used here. For more information, see the Snowflake LEFT function documentation.

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

Case 3 - multiple columns - same size by table: UNION ALL for columns VARCHAR(20) over columns 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

Case 4 - multiple columns - same size by table: UNION ALL for columns VARCHAR(10) over columns VARCHAR(20)

Avertissement

In this case, the functional equivalence is not the same.

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

Case 5 - multiple columns - different sizes by table: UNION ALL for columns VARCHAR(10) over columns 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

Case 6 - multiple columns - different sizes by table: UNION ALL for columns VARCHAR(20), VARCHAR(10) over columns VARCHAR(10), VARCHAR(5)

Avertissement

In this case, the functional equivalence is not the same.

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

Case 7 - multiple columns expression - different sizes by table: UNION ALL for columns VARCHAR(20), VARCHAR(20) over columns VARCHAR(10), VARCHAR(10)

Use the data set up in Case 3 — Multiple columns — Same size by table. Once the new tables and data are created, the following query can be evaluated.

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

Case 8 - multiple columns expression - different sizes by table: UNION ALL for columns VARCHAR(20), VARCHAR(20) over columns 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é

The sum of the column sizes of the smaller column should be used in the LEFT function. For example, if the smaller column is VARCHAR(10), then the limit of the LEFT function should be 20 (10 + 10).

Avertissement

If the first SELECT result is smaller, its sum would be used for the truncation of the values.

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

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