SnowConvert AI - Teradata - データ移行に関する考慮事項

このセクションでは、TeradataからSnowflakeにデータを移行する際の重要な考慮事項について説明します。

注釈

これは進行中の作業であることを考慮してください。

TeradataからSnowflakeにデータを移行する場合、データベース間の機能の違いを考慮することが重要です。このページでは、データ移行に最適な提案を紹介します。

以下の情報をご確認ください。

UNION ALL データ移行

UNION ALL のデータ移行に関する考慮事項。

UNION ALL は、 SQL 演算子で、複数の結果セットを組み合わせることができます。構文は以下の通りです。

 query_expression_1 UNION [ ALL ] query_expression_2

詳細情報については、以下の Teradata ドキュメントを参照してください。

列サイズの違い

演算子がSnowflakeでは同じ演算子に変換されていても、機能の等価性には細かな違いがある可能性があります。例えば、列サイズが異なる列の結合です。Teradataは、最初の SELECT ステートメントに列のスペースが少ない場合、値を切り捨てます。

Teradataの動作

注釈

ANSI および TERA セッションモードで同じ動作。

この例では、以下の入力がTeradataの動作を示します。

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');
Snowflakeの設定データ
 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

この場合、機能的等価性は同じです

Teradataの入力
 SELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2;
Teradataの出力
value 1 abcdefghijk
t2 row 3 a
value 2 abcdefghijk
t2 row 1 a
t2 row 2 a

Snowflakeの入力
 SELECT
col1 FROM
table1
UNION ALL
SELECT
col1 FROM
table2;
Snowflakeの出力
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)

危険

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

次のケースは、Snowflakeでは機能的等価性を示しません。列の値は、Teradataのサンプルと同様に切り捨ててください。

Teradataの入力
 SELECT col1 FROM table2
UNION ALL
SELECT col1 FROM table1;
Teradataの出力
t2 row 3 a
value 1 ab --> truncated
t2 row 1 a
t2 row 2 a
value 2 ab --> truncated

Snowflakeの入力
 SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
Snowflakeの出力
t2 row 3 a
value 1 abcdefghijk --> NOT truncated
t2 row 1 a
t2 row 2 a
value 2 abcdefghijk --> NOT truncated

同じ関数を得るための回避策

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

この場合、次のように新しいデータをセットする必要があります。

Teradataの設定データ
 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の設定データ
 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');

新しいテーブルとデータが作成されると、以下のクエリが評価できるようになります。

注釈

この場合、機能的等価性は同じです

Teradataの入力
 select col1, col2 from table3
union all
select col1, col2 from table4;
Teradataの出力

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の入力
 SELECT
col1, col2 FROM
table3
UNION ALL
SELECT
col1, col2 FROM
table4;
Snowflakeの出力

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)

警告

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

Teradataの入力
 select col1, col2 from table4
union all
select col1, col2 from table3;
Teradataの出力

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の入力
 SELECT
col1, col2 FROM
table4
UNION ALL
SELECT
col1, col2 FROM
table3;
Snowflakeの出力

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

同じ関数を得るための回避策

同じ機能を得るには、列の2番目の SELECT に列サイズを適用します。

Snowflakeの入力
 SELECT col1, col2 FROM table4 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1, LEFT(col2, 10) AS col2 FROM table3;
Snowflakeの出力

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)

この場合、次のように新しいデータをセットする必要があります。

Teradataの設定データ
 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の設定データ
 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');

新しいテーブルとデータが作成されると、以下のクエリが評価できるようになります。

注釈

この場合、機能的等価性は同じです

Teradataの入力
 select col1, col2 from table5
union all
select col1, col2 from table6;
Teradataの出力

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の入力
 SELECT
col1, col2 FROM
table5
UNION ALL
SELECT
col1, col2 FROM
table6;
Snowflakeの出力

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)

警告

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

Teradataの入力
 select col1, col2 from table6
union all
select col1, col2 from table5;
Teradataの出力

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の入力
 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
col1, col2 FROM
table5;
Snowflakeの出力

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

同じ関数を得るための回避策

最初の SELECT のサイズが最も小さい列を使用して、2番目の SELECT の列のサイズを決定します。

Snowflakeの入力
 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
LEFT(col1, 5) as col1, LEFT(col2, 5) AS col2 FROM
table5;
Snowflakeの出力

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.

注釈

この場合、機能的等価性は同じです

Teradataの入力
 select col1 || col2 from table3
union all
select col1 || col2 from table4;
Teradataの出力

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の入力
 SELECT
col1 || col2 FROM
table3
UNION ALL
SELECT
col1 || col2 FROM
table4;
Snowflakeの出力

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)

警告

このケースには機能的な違いがあります。

Teradataの入力
 select col1 || col2 from table4
union all
select col1 || col2 from table3;
Teradataの出力

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の入力
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
col1 || col2 FROM
table3;
Snowflakeの出力

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

同じ関数を得るための回避策

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

警告

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

Snowflakeの入力
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
LEFT(col1 || col2, 20) FROM
table3;
Snowflakeの出力

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

列サイズの違いに関するその他の考慮事項

  • CHARVARCHAR は同じように動作します。

  • 数値列は異なる動作をする場合があります。数値は切り捨てられないので、Teradata環境ではオーバーフローが発生します。そのため、これらのデータ型には適用されません。次の例を見てください。

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