Überlegungen zur Datenmigration¶
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¶
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.
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');
Fall 1 - eine einzige Spalte: UNION ALL für eine Spalte Varchar (20) über eine Spalte Varchar (10)¶
In diesem Fall ist die Funktionsäquivalenz dieselbe
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
Fall 2 - eine einzige Spalte: UNION ALL für eine Spalte Varchar (10) über eine Spalte Varchar (20)
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.
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
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.
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
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:
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');
Sobald die neuen Tabellen und Daten erstellt sind, kann die folgende Abfrage ausgewertet werden.
Bemerkung
In diesem Fall ist die Funktionsäquivalenz dieselbe
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 |
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.
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 |
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.
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 |
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:
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');
Sobald die neuen Tabellen und Daten erstellt sind, kann die folgende Abfrage ausgewertet werden.
Bemerkung
In diesem Fall ist die Funktionsäquivalenz dieselbe
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 |
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.
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** |
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.
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** |
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
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 |
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.
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 |
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.
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 |
Andere Überlegungen zu unterschiedlichen Spaltengrößen¶
CHAR
undVARCHAR
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:
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;