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
Copy

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

Fall 1 – eine einzelne Spalte: UNION ALL für eine Spalte varchar (20) über eine Spalte varchar (10)

SuccessPlaceholder

In diesem Fall ist die Funktionsäquivalenz dieselbe

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

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

Copy

Fall 2 – eine einzelne Spalte: UNION ALL für eine Spalte varchar (10) über eine Spalte varchar (20)

Gefahr

In diesem Fall ist die Funktionsäquivalenz nicht dieselbe.

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

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

Copy

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

In diesem Fall ist die Größe der Spalte der table2 10 und die table1 20. Die Größe der ersten Spalte in der Abfrage sollte also das Element sein, um die hier verwendete Funktion LEFT() zu vervollständigen. Lesen Sie weitere Informationen über die Snowflake-Funktion LEFT HERE.

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

Copy

Fall 3 – mehrere Spalten – gleiche Größe nach Tabelle: UNION ALL für Spalten varchar (20) über Spalten 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');
Copy
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');
Copy

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

Fall 4 - mehrere Spalten - gleiche Größe nach Tabelle: UNION ALL für Spalten Varchar (10) über Spalten Varchar (20)

Warnung

In diesem Fall ist die Funktionsäquivalenz nicht dieselbe.

Teradata-Eingabe
 select col1, col2 from table4
union all
select col1, col2 from table3;
Copy
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;
Copy
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;
Copy
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

Fall 5 - mehrere Spalten - unterschiedliche Größen pro Tabelle: UNION ALL für Spalten Varchar (10) über Spalten 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');
Copy
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');
Copy

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

Fall 6 - mehrere Spalten - unterschiedliche Größen pro Tabelle: UNION ALL für die Spalten Varchar (20), Varchar (10) über die Spalten Varchar (10), Varchar (5)

Warnung

In diesem Fall ist die Funktionsäquivalenz nicht dieselbe.

Teradata-Eingabe
 select col1, col2 from table6
union all
select col1, col2 from table5;
Copy
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;
Copy
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;
Copy
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

Fall 7 - mehrere Spalten expression - unterschiedliche Größen nach Tabelle: UNION ALL für Spalten Varchar (20), Varchar (20) über Spalten Varchar (10), Varchar (10)

Verwenden Sie hier die Dateneinrichtung case-3---multiple-columns---same-size-by-table-union-all-for-columns-Varchar-20-over-columns-Varchar-10. 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;
Copy
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;
Copy
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

Fall 8 - mehrere Spalten expression - unterschiedliche Größen nach Tabelle: UNION ALL für Spalten Varchar (20), Varchar (20) über Spalten 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;
Copy
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;
Copy
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

Die Summe der Spaltengrößen der weniger großen Spalte sollte in der Funktion LEFT verwendet werden. Zum Beispiel ist die weniger große Spalte Varchar (10), so dass die Grenze der Funktion LEFT 20 (10 + 10) sein sollte.

Warnung

Wenn die Summe der ersten SELECT weniger groß ist, würde sie für das Abschneiden der Werte verwendet werden.

Snowflake-Eingabe
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
LEFT(col1 || col2, 20) FROM
table3;
Copy
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;
Copy