SnowConvert AI – Teradata – Hinweise zur Datenmigration

In diesem Abschnitt werden wichtige Hinweise zur Migration von Daten von Teradata nach Snowflake gegeben.

Bemerkung

Bedenken Sie, dass dies eine laufende Arbeit ist.

Bei der Migration von Daten von Teradata zu Snowflake ist es wichtig, die funktionalen Unterschiede zwischen den Datenbanken zu berücksichtigen. Auf dieser Seite finden Sie die besten Vorschläge für die Migration von Daten.

Überprüfen Sie die folgenden Informationen:

UNION ALL-Datenmigration

Hinweise zur Datenmigration für UNION ALL.

UNION ALL ist ein SQL Operator, der die Kombination mehrerer Resultsets ermöglicht. Die Syntax lautet wie folgt:

 query_expression_1 UNION [ ALL ] query_expression_2

Weitere Informationen finden Sie in der folgenden Teradata-Dokumentation.

Spalte Größenunterschiede

Auch wenn der Operator in Snowflake in den gleichen Operator übersetzt wird, kann es detaillierte Unterschiede in der Funktionsäquivalenz geben. Zum Beispiel die Vereinigung von verschiedenen Spalten, die unterschiedliche Spaltengrößen haben. Teradata schneidet die Werte ab, wenn die erste SELECT Anweisung weniger Platz in den Spalten enthält.

Teradata-Verhaltensweise

Bemerkung

Gleiche Verhaltensweise in den Sitzungsmodi ANSI und TERA.

Für dieses Beispiel zeigt die folgende Eingabe die Verhaltensweise von Teradata.

Teradata-Setup-Daten
 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');
Snowflake-Setup-Daten
 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

In diesem Fall ist die Funktionsäquivalenz dieselbe

Teradata-Eingabe
 SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2;
Teradata-Ausgabe
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a

Snowflake-Eingabe
 SELECT
col1 FROM
table1
UNION ALL
SELECT
col1 FROM
table2;
Snowflake-Ausgabe
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)

Gefahr

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

Der folgende Fall zeigt keine Funktionsäquivalenz in Snowflake. Die Spaltenwerte sollten wie in dem Teradata-Beispiel gekürzt werden.

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

Snowflake-Eingabe
 SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
Snowflake-Ausgabe
t2 row 3 a
value 1 abcdefghijk --> NOT truncated
t2 row 1 a
t2 row 2 a
value 2 abcdefghijk --> NOT truncated

Umgehungsmöglichkeit, um die gleiche Funktionalität zu erhalten

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.

Snowflake-Eingabe
 SELECT col1 FROM table2 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1 FROM table1;
Snowflake-Ausgabe
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)

In diesem Fall müssen Sie die neuen Daten wie folgt einrichten:

Teradata-Setup-Daten
 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');
Snowflake-Setup-Daten
 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');

Sobald die neuen Tabellen und Daten erstellt sind, kann die folgende Abfrage ausgewertet werden.

Bemerkung

In diesem Fall ist die Funktionsäquivalenz dieselbe

Teradata-Eingabe
 select col1, col2 from table3
union all
select col1, col2 from table4;
Teradata-Ausgabe

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

Snowflake-Eingabe
 SELECT
col1, col2 FROM
table3
UNION ALL
SELECT
col1, col2 FROM
table4;
Snowflake-Ausgabe

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

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

Warnung

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

Teradata-Eingabe
 select col1, col2 from table4
union all
select col1, col2 from table3;
Teradata-Ausgabe

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

Snowflake-Eingabe
 SELECT
col1, col2 FROM
table4
UNION ALL
SELECT
col1, col2 FROM
table3;
Snowflake-Ausgabe

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

Umgehungsmöglichkeit, um die gleiche Funktionalität zu erhalten

Wenden Sie die Spaltengröße auf die zweite SELECT auf die Spalten an, um die gleiche Funktionalität zu erhalten.

Snowflake-Eingabe
 SELECT col1, col2 FROM table4 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1, LEFT(col2, 10) AS col2 FROM table3;
Snowflake-Ausgabe

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

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

In diesem Fall müssen Sie die neuen Daten wie folgt einrichten:

Teradata-Setup-Daten
 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');
Snowflake-Setup-Daten
 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');

Sobald die neuen Tabellen und Daten erstellt sind, kann die folgende Abfrage ausgewertet werden.

Bemerkung

In diesem Fall ist die Funktionsäquivalenz dieselbe

Teradata-Eingabe
 select col1, col2 from table5
union all
select col1, col2 from table6;
Teradata-Ausgabe

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

Snowflake-Eingabe
 SELECT
col1, col2 FROM
table5
UNION ALL
SELECT
col1, col2 FROM
table6;
Snowflake-Ausgabe

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

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

Warnung

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

Teradata-Eingabe
 select col1, col2 from table6
union all
select col1, col2 from table5;
Teradata-Ausgabe

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

Snowflake-Eingabe
 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
col1, col2 FROM
table5;
Snowflake-Ausgabe

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

Umgehungsmöglichkeit, um die gleiche Funktionalität zu erhalten

Die Spalte mit der kleinsten Größe aus der ersten SELECT wird verwendet, um die Größe der Spalten aus der zweiten SELECT zu bestimmen.

Snowflake-Eingabe
 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
LEFT(col1, 5) as col1, LEFT(col2, 5) AS col2 FROM
table5;
Snowflake-Ausgabe

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

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.

Bemerkung

In diesem Fall ist die Funktionsäquivalenz dieselbe

Teradata-Eingabe
 select col1 || col2 from table3
union all
select col1 || col2 from table4;
Teradata-Ausgabe

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

Snowflake-Eingabe
 SELECT
col1 || col2 FROM
table3
UNION ALL
SELECT
col1 || col2 FROM
table4;
Snowflake-Ausgabe

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

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

Warnung

Dieser Fall weist funktionelle Unterschiede auf.

Teradata-Eingabe
 select col1 || col2 from table4
union all
select col1 || col2 from table3;
Teradata-Ausgabe

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

Snowflake-Eingabe
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
col1 || col2 FROM
table3;
Snowflake-Ausgabe

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

Umgehungsmöglichkeit, um die gleiche Funktionalität zu erhalten

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

Warnung

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

Snowflake-Eingabe
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
LEFT(col1 || col2, 20) FROM
table3;
Snowflake-Ausgabe

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

Andere Überlegungen zu unterschiedlichen Spaltengrößen

  • CHAR und VARCHAR verhalten sich gleich.

  • Zahlenspalten können sich anders verhalten. Die Zahlen können nicht gekürzt werden, so dass es in der Teradata-Umgebung zu einem Überlauf kommt. Daher wird dies nicht auf diese Datentypen angewendet. Sehen Sie sich das folgende Beispiel an:

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