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
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');
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 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;
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a
SELECT
col1 FROM
table1
UNION ALL
SELECT
col1 FROM
table2;
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 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;
t2 row 3 a
value 1 ab --> truncated
t2 row 1 a
t2 row 2 a
value 2 ab --> truncated
SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
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.
SELECT col1 FROM table2 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1 FROM table1;
t2 row 1 a
t2 row 2 a
t2 row 3 a
value 1 ab
value 2 ab
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');
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
select col1, col2 from table3
union all
select col1, col2 from table4;
| 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 |
SELECT
col1, col2 FROM
table3
UNION ALL
SELECT
col1, col2 FROM
table4;
| 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 |
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;
| 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 |
SELECT
col1, col2 FROM
table4
UNION ALL
SELECT
col1, col2 FROM
table3;
| 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 |
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;
| 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 |
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');
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
select col1, col2 from table5
union all
select col1, col2 from table6;
| 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 |
SELECT
col1, col2 FROM
table5
UNION ALL
SELECT
col1, col2 FROM
table6;
| 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 |
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;
| 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** |
SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
col1, col2 FROM
table5;
| 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** |
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;
| 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** |
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;
| 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 |
SELECT
col1 || col2 FROM
table3
UNION ALL
SELECT
col1 || col2 FROM
table4;
| 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 |
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;
| 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 |
SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
col1 || col2 FROM
table3;
| 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 |
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;
| 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 |
Autres considérations sur les différences de taille des colonnes¶
CHAR
etVARCHAR
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;