Considérations relatives à la migration de données

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

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.

 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
 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 une colonne varchar (20) par rapport à une colonne varchar (10)

Dans ce cas, l’équivalence fonctionnelle est la même

 SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2;
Copy
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a

Copy
 SELECT
col1 FROM
table1
UNION ALL
SELECT
col1 FROM
table2;
Copy
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 une colonne varchar (10) par rapport à une colonne varchar (20)

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.

 SELECT col1 FROM table2
UNION ALL
SELECT col1 FROM table1;
Copy
t2 row 3 a
value 1 ab --> truncated
t2 row 1 a
t2 row 2 a
value 2 ab --> truncated

Copy
 SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
Copy
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.

 SELECT col1 FROM table2 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1 FROM table1;
Copy
t2 row 1 a
t2 row 2 a
t2 row 3 a
value 1 ab
value 2 ab

Copy

Cas 3 - colonnes multiples - même taille par table : UNION ALL pour les colonnes varchar (20) par rapport aux colonnes varchar (10)

Dans ce cas, il est exigé d’établir de nouvelles données comme suit :

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

 select col1, col2 from table3
union all
select col1, col2 from table4;
Copy

| col1                | col2                |
| ------------------- | ------------------- |
| value 1 abcdefghijk | value 1 abcdefghijk |
| t2 row 3 a          | t2 row 3 b          |
| value 2 abcdefghijk | value 2 abcdefghijk |
| t2 row 1 a          | t2 row 1 b          |
| t2 row 2 a          | t2 row 2 b          |

Copy
 SELECT
col1, col2 FROM
table3
UNION ALL
SELECT
col1, col2 FROM
table4;
Copy
| col1                | col2                |
| ------------------- | ------------------- |
| value 1 abcdefghijk | value 1 abcdefghijk |
| value 2 abcdefghijk | value 2 abcdefghijk |
| t2 row 1 a          | t2 row 1 b          |
| t2 row 2 a          | t2 row 2 b          |
| t2 row 3 a          | t2 row 3 b          |
Copy

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.

 select col1, col2 from table4
union all
select col1, col2 from table3;
Copy
| col1       | col2       |
| ---------- | ---------- |
| t2 row 3 a | t2 row 3 b |
| value 1 ab | value 1 ab |
| t2 row 1 a | t2 row 1 b |
| t2 row 2 a | t2 row 2 b |
| value 2 ab | value 2 ab |
Copy
 SELECT
col1, col2 FROM
table4
UNION ALL
SELECT
col1, col2 FROM
table3;
Copy
| col1                | col2                |
| ------------------- | ------------------- |
| t2 row 1 a          | t2 row 1 b          |
| t2 row 2 a          | t2 row 2 b          |
| t2 row 3 a          | t2 row 3 b          |
| value 1 abcdefghijk | value 1 abcdefghijk |
| value 2 abcdefghijk | value 2 abcdefghijk |
Copy

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é.

 SELECT col1, col2 FROM table4 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1, LEFT(col2, 10) AS col2 FROM table3;
Copy
| col1       | col2       |
| ---------- | ---------- |
| t2 row 1 a | t2 row 1 b |
| t2 row 2 a | t2 row 2 b |
| t2 row 3 a | t2 row 3 b |
| value 1 ab | value 1 ab |
| value 2 ab | value 2 ab |
Copy

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 :

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

 select col1, col2 from table5
union all
select col1, col2 from table6;
Copy
| col1                | col2         |
| ------------------- | ------------ |
| value 1 abcdefghijk | value 1 abcd |
| t2 row 3 a          | t2 3b        |
| value 2 abcdefghijk | value 2 abcd |
| t2 row 1 a          | t2 1b        |
| t2 row 2 a          | t2 2b        |
Copy
 SELECT
col1, col2 FROM
table5
UNION ALL
SELECT
col1, col2 FROM
table6;
Copy
| col1                | col2         |
| ------------------- | ------------ |
| value 1 abcdefghijk | value 1 abcd |
| value 2 abcdefghijk | value 2 abcd |
| t2 row 1 a          | t2 1b        |
| t2 row 2 a          | t2 2b        |
| t2 row 3 a          | t2 3b        |
Copy

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.

 select col1, col2 from table6
union all
select col1, col2 from table5;
Copy
| col1           | col2      |
| -------------- | --------- |
| t2 row 3 a     | t2 3b     |
| **value 1 ab** | **value** |
| t2 row 1 a     | t2 1b     |
| t2 row 2 a     | t2 2b     |
| **value 2 ab** | **value** |
Copy
 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
col1, col2 FROM
table5;
Copy
| col1                    | col2             |
| ----------------------- | ---------------- |
| t2 row 1 a              | t2 1b            |
| t2 row 2 a              | t2 2b            |
| t2 row 3 a              | t2 3b            |
| **value 1 abcdefghijk** | **value 1 abcd** |
| **value 2 abcdefghijk** | **value 2 abcd** |

Copy

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.

 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
LEFT(col1, 5) as col1, LEFT(col2, 5) AS col2 FROM
table5;
Copy

| col1           | col2      |
| -------------- | --------- |
| t2 row 3 a     | t2 3b     |
| **value 1 ab** | **value** |
| t2 row 1 a     | t2 1b     |
| t2 row 2 a     | t2 2b     |
| **value 2 ab** | **value** |

Copy

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

 select col1 || col2 from table3
union all
select col1 || col2 from table4;
Copy
| col1 \|\| col2                         |
| -------------------------------------- |
| value 1 abcdefghijkvalue 1 abcdefghijk |
| t2 row 3 at2 row 3 b                   |
| value 2 abcdefghijkvalue 2 abcdefghijk |
| t2 row 1 at2 row 1 b                   |
| t2 row 2 at2 row 2 b                   |
Copy
 SELECT
col1 || col2 FROM
table3
UNION ALL
SELECT
col1 || col2 FROM
table4;
Copy
| col1 \|\| col2                         |
| -------------------------------------- |
| value 1 abcdefghijkvalue 1 abcdefghijk |
| value 2 abcdefghijkvalue 2 abcdefghijk |
| t2 row 1 at2 row 1 b                   |
| t2 row 2 at2 row 2 b                   |
| t2 row 3 at2 row 3 b                   |
Copy

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.

 select col1 || col2 from table4
union all
select col1 || col2 from table3;
Copy
| col1 \|\| col2       |
| -------------------- |
| t2 row 1 at2 row 1 b |
| t2 row 2 at2 row 2 b |
| t2 row 3 at2 row 3 b |
| value 1 abcdefghijkv |
| value 2 abcdefghijkv |
Copy
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
col1 || col2 FROM
table3;
Copy
| col1 \|\| col2                         |
| -------------------------------------- |
| t2 row 1 at2 row 1 b                   |
| t2 row 2 at2 row 2 b                   |
| t2 row 3 at2 row 3 b                   |
| value 1 abcdefghijkvalue 1 abcdefghijk |
| value 2 abcdefghijkvalue 2 abcdefghijk |
Copy

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.

 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
LEFT(col1 || col2, 20) FROM
table3;
Copy
| col1 \|\| col2       |
| -------------------- |
| t2 row 1 at2 row 1 b |
| t2 row 2 at2 row 2 b |
| t2 row 3 at2 row 3 b |
| value 1 abcdefghijkv |
| value 2 abcdefghijkv |
Copy

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 :

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