데이터 마이그레이션 고려 사항

참고

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

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

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

UNION ALL 데이터 마이그레이션

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

 query_expression_1 UNION [ ALL ] query_expression_2
Copy

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

열 크기 차이

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

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(10)을 초과하는 열 varchar(20)의 경우 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(20)을 초과하는 열 varchar(10)의 경우 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 함수에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

 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(10)을 초과하는 열 varchar(20)의 경우 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

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

열의 두 번째 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(10), varchar(5)를 초과하는 열 varchar(20), varchar(10)의 경우 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 에서 가장 작은 크기의 열은 두 번째 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(10), varchar(10)을 초과하는 열 varchar (20), varchar(20)의 경우 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(10), varchar(10)을 초과하는 열 varchar (20), varchar(20)의 경우 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