SnowConvert AI - Teradata - 데이터 마이그레이션 고려 사항

이 섹션에서는 Teradata에서 Snowflake로 데이터를 마이그레이션할 때 중요한 고려 사항에 대해 설명합니다.

참고

이는 현재 진행 중인 작업입니다.

Teradata에서 Snowflake로 데이터를 마이그레이션할 때는 데이터베이스 간의 기능적 차이점을 고려하는 것이 중요합니다. 이 페이지에서는 데이터 마이그레이션을 위한 최상의 제안을 소개합니다.

다음 정보를 검토하십시오.

UNION ALL 데이터 마이그레이션

UNION ALL에 대한 데이터 마이그레이션 고려 사항

UNION ALL 은 여러 결과 집합을 조합할 수 있는 SQL 연산자입니다. 구문은 다음과 같습니다.

 query_expression_1 UNION [ ALL ] query_expression_2

자세한 내용은 다음 Teradata 설명서를 참조하십시오.

열 크기 차이

연산자가 Snowflake에서 동일한 연산자로 변환되더라도 기능적 동등성에는 세부적인 차이가 있을 수 있습니다. 예를 들어, 열 크기가 다른 여러 열을 합치는 경우입니다. 첫 번째 SELECT 문에 열에 공백이 적은 경우 Teradata는 값을 잘라냅니다.

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

동일한 기능을 이용하기 위한 해결 방법

열의 두 번째 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 에서 가장 작은 크기의 열은 두 번째 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;