データ移行に関する考慮事項¶
注釈
これは進行中の作業であることを考慮してください。
TeradataからSnowflakeにデータを移行する場合、データベース間の機能の違いを考慮することが重要です。このページでは、データ移行に最適な提案を紹介します。
以下の情報をご確認ください。
UNION ALL データ移行¶
UNION ALL は、 SQL 演算子で、複数の結果セットを組み合わせることができます。構文は以下の通りです。
query_expression_1 UNION [ ALL ] query_expression_2
詳細情報については、以下の Teradata ドキュメントを参照してください。
列サイズの違い¶
演算子がSnowflakeでは同じ演算子に変換されていても、機能の等価性には細かな違いがある可能性があります。例えば、列サイズが異なる列の結合です。Teradataは、最初の SELECT ステートメントに列のスペースが少ない場合、値を切り捨てます。
Teradataの動作¶
注釈
ANSI および TERA セッションモードで同じ動作。
この例では、以下の入力が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');
ケース1 - 1つの列: 列varchar (20)を列varchar (10)で UNION ALL¶
この場合、機能的等価性は同じです
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
ケース2 - 1つの列: 列varchar (10)を列varchar (20)で UNION ALL
この場合、機能的等価性は同じではありません。
次のケースは、Snowflakeでは機能的等価性を示しません。列の値は、Teradataのサンプルと同様に切り捨ててください。
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
同じ関数を得るための回避策
この場合、 table2
の列のサイズは10で、 table1
の列のサイズは20です。ですから、クエリの最初の列のサイズは、ここで使用されている LEFT()
関数を完了するための要素でなければなりません。Snowflake 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
ケース3 - 複数の列 - テーブルによって同じサイズ: 列varchar (20)を列varchar (10)で UNION ALL¶
この場合、次のように新しいデータをセットする必要があります。
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');
新しいテーブルとデータが作成されると、以下のクエリが評価できるようになります。
注釈
この場合、機能的等価性は同じです
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 |
ケース4 - 複数の列 - テーブルによって同じサイズ: 列varchar (10)を列varchar (20)で UNION ALL¶
警告
この場合、機能的等価性は同じではありません。
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 |
同じ関数を得るための回避策
同じ機能を得るには、列の2番目の SELECT
に列サイズを適用します。
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 |
ケース5 - 複数の列 - テーブルによって異なるサイズ: 列varchar (10)を列varchar (20)で UNION ALL¶
この場合、次のように新しいデータをセットする必要があります。
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');
新しいテーブルとデータが作成されると、以下のクエリが評価できるようになります。
注釈
この場合、機能的等価性は同じです
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 |
ケース6 - 複数の列 - テーブルによって異なるサイズ: 列varchar (20)、varchar(10)を列varchar (10)、varchar(5)で UNION ALL¶
警告
この場合、機能的等価性は同じではありません。
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** |
同じ関数を得るための回避策
最初の SELECT
のサイズが最も小さい列を使用して、2番目の SELECT
の列のサイズを決定します。
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** |
ケース7 - 複数の列 expression - テーブルによって異なるサイズ: 列varchar (20)、varchar(20)を列varchar (10)、varchar(10)で UNION ALL¶
こちらで設定されたデータを使用します。新しいテーブルとデータが作成されると、以下のクエリが評価できるようになります。
注釈
この場合、機能的等価性は同じです
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 |
ケース8 - 複数の列 expression - テーブルによって異なるサイズ: 列varchar (20)、varchar(20)を列varchar (10)、varchar(10)で UNION ALL¶
警告
このケースには機能的な違いがあります。
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 |
同じ関数を得るための回避策
LEFT
関数では、小さい方の列の列サイズの合計を使用する必要があります。例えば、小さい方の列はvarchar(10)なので、 LEFT
関数の上限は20(10 + 10)となります。
警告
最初の SELECT
の合計。これが小さければ、値の切り捨てに使用されます。
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 |
列サイズの違いに関するその他の考慮事項¶
CHAR
とVARCHAR
は同じように動作します。数値列は異なる動作をする場合があります。数値は切り捨てられないので、Teradata環境ではオーバーフローが発生します。そのため、これらのデータ型には適用されません。次の例を見てください。
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;