데이터 마이그레이션 고려 사항¶
참고
이는 현재 진행 중인 작업입니다.
Teradata에서 Snowflake로 데이터를 마이그레이션할 때는 데이터베이스 간의 기능적 차이점을 고려하는 것이 중요합니다. 이 페이지에서는 데이터 마이그레이션을 위한 최상의 제안을 소개합니다.
다음 정보를 검토하십시오.
UNION ALL 데이터 마이그레이션¶
UNION ALL 은 여러 결과 집합을 조합할 수 있는 SQL 연산자입니다. 구문은 다음과 같습니다.
query_expression_1 UNION [ ALL ] query_expression_2
자세한 내용은 다음 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');
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(10)을 초과하는 열 varchar(20)의 경우 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(20)을 초과하는 열 varchar(10)의 경우 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 함수에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
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(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');
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 |
동일한 기능을 이용하기 위한 해결 방법
열의 두 번째 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(10), varchar(5)를 초과하는 열 varchar(20), varchar(10)의 경우 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
에서 가장 작은 크기의 열은 두 번째 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(10), varchar(10)을 초과하는 열 varchar (20), varchar(20)의 경우 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(10), varchar(10)을 초과하는 열 varchar (20), varchar(20)의 경우 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;