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

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

注釈

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

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

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

UNION ALL データ移行

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

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

 query_expression_1 UNION [ ALL ] query_expression_2
Copy

詳細情報については、以下の 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');
Copy
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');
Copy

**ケース1 - 単一の列: varchar (20)の列をvarchar (10)の列に UNION ALL **

SuccessPlaceholder

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

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

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

Copy

**ケース2 - 単一の列: varchar (10)の列をvarchar (20)の列に UNION ALL **

危険

この場合、機能的等価性は同じではありません。

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

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

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

Copy

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

この場合、 table2 の列のサイズは10で、 table1 の列のサイズは20です。ですから、クエリの最初の列のサイズは、ここで使用されている LEFT() 関数を完了するための要素でなければなりません。Snowflake LEFT 関数の詳細情報をご確認ください HERE

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

Copy

**ケース3 - 複数の列 - テーブルごとに同じサイズ: varchar (20)の列をvarchar (10)の列に UNION ALL **

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

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

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

注釈

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

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

ケース4 - 複数の列 - テーブルによって同じサイズ: 列varchar (10)を列varchar (20)で UNION ALL

警告

この場合、機能的等価性は同じではありません。

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

ケース5 - 複数の列 - テーブルによって異なるサイズ: 列varchar (10)を列varchar (20)で UNION ALL

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

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

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

注釈

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

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

ケース6 - 複数の列 - テーブルによって異なるサイズ: 列varchar (20)、varchar(10)を列varchar (10)、varchar(5)で UNION ALL

警告

この場合、機能的等価性は同じではありません。

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

ケース7 - 複数の列 expression - テーブルによって異なるサイズ: 列varchar (20)、varchar(20)を列varchar (10)、varchar(10)で UNION ALL

こちらで設定されたデータを使用します。新しいテーブルとデータが作成されると、以下のクエリが評価できるようになります。

注釈

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

Teradataの入力
 select col1 || col2 from table3
union all
select col1 || col2 from table4;
Copy
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;
Copy
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

ケース8 - 複数の列 expression - テーブルによって異なるサイズ: 列varchar (20)、varchar(20)を列varchar (10)、varchar(10)で UNION ALL

警告

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

Teradataの入力
 select col1 || col2 from table4
union all
select col1 || col2 from table3;
Copy
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;
Copy
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

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

LEFT 関数では、小さい方の列の列サイズの合計を使用する必要があります。例えば、小さい方の列はvarchar(10)なので、 LEFT 関数の上限は20(10 + 10)となります。

警告

最初の SELECT の合計。これが小さければ、値の切り捨てに使用されます。

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