データ移行に関する考慮事項

注釈

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

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

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

UNION ALL データ移行

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

 query_expression_1 UNION [ ALL ] query_expression_2
Copy

詳細情報については、以下の 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');
Copy
 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 - 1つの列: 列varchar (20)を列varchar (10)で UNION ALL

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

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

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

Copy

ケース2 - 1つの列: 列varchar (10)を列varchar (20)で UNION ALL

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

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

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

Copy
 SELECT
col1 FROM
table2
UNION ALL
SELECT
col1 FROM
table1;
Copy
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

 SELECT col1 FROM table2 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1 FROM table1;
Copy
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

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

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

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

注釈

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

 select col1, col2 from table3
union all
select col1, col2 from table4;
Copy

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

Copy
 SELECT
col1, col2 FROM
table3
UNION ALL
SELECT
col1, col2 FROM
table4;
Copy
| 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          |
Copy

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

警告

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

 select col1, col2 from table4
union all
select col1, col2 from table3;
Copy
| 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 |
Copy
 SELECT
col1, col2 FROM
table4
UNION ALL
SELECT
col1, col2 FROM
table3;
Copy
| 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 |
Copy

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

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

 SELECT col1, col2 FROM table4 -- size (10)
UNION ALL
SELECT LEFT(col1, 10) AS col1, LEFT(col2, 10) AS col2 FROM table3;
Copy
| 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 |
Copy

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

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

注釈

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

 select col1, col2 from table5
union all
select col1, col2 from table6;
Copy
| 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        |
Copy
 SELECT
col1, col2 FROM
table5
UNION ALL
SELECT
col1, col2 FROM
table6;
Copy
| 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        |
Copy

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

警告

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

 select col1, col2 from table6
union all
select col1, col2 from table5;
Copy
| 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** |
Copy
 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
col1, col2 FROM
table5;
Copy
| 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** |

Copy

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

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

 SELECT
col1, col2 FROM
table6
UNION ALL
SELECT
LEFT(col1, 5) as col1, LEFT(col2, 5) AS col2 FROM
table5;
Copy

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

Copy

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

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

注釈

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

 select col1 || col2 from table3
union all
select col1 || col2 from table4;
Copy
| 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                   |
Copy
 SELECT
col1 || col2 FROM
table3
UNION ALL
SELECT
col1 || col2 FROM
table4;
Copy
| 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                   |
Copy

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

警告

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

 select col1 || col2 from table4
union all
select col1 || col2 from table3;
Copy
| 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 |
Copy
 SELECT
col1 || col2 FROM
table4
UNION ALL
SELECT
col1 || col2 FROM
table3;
Copy
| 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 |
Copy

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

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

警告

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

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

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

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

  • 数値列は異なる動作をする場合があります。数値は切り捨てられないので、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;
Copy