SnowConvert: Redshift 기능 차이점¶
SSC-FDM-RS0001¶
설명¶
Snowflake는 Redshift와 달리 데이터 배포 및 최적화를 자동으로 관리합니다. Redshift에서 Snowflake로 마이그레이션할 때, Snowflake의 아키텍처가 데이터 파티션과 인덱싱을 자동으로 처리하여 쿼리 성능을 최적화하기 때문에 SORTKEY
및 DISTSTYLE
매개 변수를 지정할 필요가 없습니다.
코드 예제¶
입력 코드:¶
CREATE TABLE table1 (
col1 INTEGER
)
DISTSTYLE AUTO;
CREATE TABLE table2 (
col1 INTEGER
)
SORTKEY AUTO;
생성된 코드:¶
CREATE TABLE table1 (
col1 INTEGER
)
----** SSC-FDM-RS0001 - DISTSTYLE AUTO OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTSTYLE AUTO
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/17/2024" }}';
CREATE TABLE table2 (
col1 INTEGER
)
----** SSC-FDM-RS0001 - SORTKEY AUTO OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--SORTKEY AUTO
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/17/2024" }}';
모범 사례¶
Snowflake에서 Redshift로부터 마이그레이션할 때는
CLUSTER BY
를 사용하는 것이 좋습니다. 이 기능은 자주 액세스하는 열을 기준으로 데이터를 조직화하여 쿼리 성능을 개선할 수 있습니다.추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0002¶
설명¶
Amazon Redshift SORTKEY
명령(SORTKEY AUTO
제외)은 Snowflake의 CLUSTER BY
명령과 비슷한 용도로 사용됩니다. Redshift와 Snowflake는 아키텍처가 다르기 때문에 이 명령을 사용할 때 다른 성능 결과가 표시될 수 있습니다.
SORTKEY
는 데이터를 지정된 열에 따라 정렬된 시퀀스로 저장하여 쿼리 성능을 개선합니다. 이는 범위 기반 쿼리 및 정렬 작업을 수행할 때 특히 유용합니다.Snowflake의
CLUSTER BY
는 선택한 열을 기준으로 관련 데이터를 마이크로 파티션으로 그룹화하여 필터링 및 집계 작업을 개선합니다.SORTKEY
와 달리 엄격한 행 순서를 유지하지 않습니다.
각 플랫폼에서 최고의 성능을 달성하려면 이러한 메커니즘이 어떻게 작동하는지 이해하는 것이 필수적입니다.
코드 예제¶
입력 코드:¶
CREATE TABLE table1 (
col1 INTEGER
)
SORTKEY (col1);
CREATE TABLE table2 (
col1 INTEGER SORTKEY
);
생성된 코드:¶
CREATE TABLE table1 (
col1 INTEGER
)
--** SSC-FDM-RS0002 - THE PERFORMANCE OF THE CLUSTER BY MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY **
CLUSTER BY (col1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/17/2024" }}'
;
CREATE TABLE table2 (
col1 INTEGER
)
--** SSC-FDM-RS0002 - THE PERFORMANCE OF THE CLUSTER BY MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY **
CLUSTER BY (col1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/17/2024" }}';
모범 사례¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0003¶
설명¶
외래 키 변환은 향후 릴리스에서 지원될 예정입니다. Snowflake의 외래 키 기능에 대한 자세한 내용은 Snowflake 설명서 를 참조하십시오.
참고
Snowflake는 외래 키 제약 조건을 적용하지 않습니다. 테이블 간의 참조 관계를 설명하는 데만 사용됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE TABLE1 (
id INTEGER,
PRIMARY KEY (id)
);
CREATE TABLE TABLE2 (
id INTEGER,
id_table1 INTEGER,
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
);
생성된 코드:¶
CREATE TABLE TABLE1 (
id INTEGER,
PRIMARY KEY (id)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/26/2024" }}';
CREATE TABLE TABLE2 (
id INTEGER,
id_table1 INTEGER
-- ,
-- --** SSC-FDM-RS0003 - THE TRANSLATION FOR FOREIGN KEY IS NOT AVAILABLE, IT WILL BE PROVIDED IN THE FUTURE. **
-- FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/26/2024" }}';
모범 사례¶
alter tables 명령을 사용하여 테이블에 외래 키를 수동으로 추가할 수 있습니다.
ALTER TABLE TABLE2 ADD CONSTRAINT
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0004¶
설명¶
Snowflake와 Redshift는 TO_DATE
함수에서 유효하지 않은 날짜를 다르게 처리합니다.
Snowflake의
TO_DATE
는 날짜의 유효성을 엄격하게 검사하고 유효하지 않은 날짜(예: ‘20010631’)가 주어지면 오류를 throw합니다. 잘못된 날짜를 수정하려고 시도하지 않습니다.Redshift의
TO_DATE
는is_strict
매개 변수가 false로 설정된 경우 유효하지 않은 날짜를 가장 가까운 유효 날짜로 자동 조정(예: 6월 31일을 7월 1일로 변환)할 수 있습니다.
이 차이는 Snowflake가 유효하지 않은 날짜를 거부하여 데이터 정확성을 강조하는 반면, Redshift는 보다 유연한 날짜 처리 옵션을 제공한다는 것을 보여줍니다.
코드 예제¶
입력 코드:¶
SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
생성된 코드:¶
SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
모범 사례¶
TRY_TO_DATE() 함수를 사용하여 날짜 형식이 올바른지 확인합니다.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0005¶
설명¶
소스 테이블에 중복된 값이 있는 MERGE 문을 실행할 때 Redshift와 Snowflake는 상황을 다르게 처리합니다. Redshift가 오류를 발생시키는 동안 Snowflake는 실행을 계속합니다. Feature Difference Manager(FDM)는 변환된 MERGE 문에서 예기치 않은 결과를 초래할 수 있으므로 사용자에게 이 동작 차이에 대해 경고합니다.
코드 예제¶
입력 코드:¶
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
생성된 코드:¶
--** SSC-FDM-RS0005 - REDSHIFT MERGE STATEMENT DOESN'T ALLOW DUPLICATES IN THE SOURCE TABLE. SNOWFLAKE BEHAVIOR MAY DIFFER IF THERE ARE DUPLICATE VALUES. **
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
모범 사례¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0006¶
설명¶
Redshift에서 프로시저에는 COMMIT 및 ROLLBACK 문을 사용하여 프로시저 외부에서 시작된 트랜잭션의 변경 내용을 저장하거나 취소할 수 있습니다.
Snowflake는 범위가 지정된 트랜잭션 을 사용하므로 각 프로시저 호출은 독립적인 트랜잭션으로 작업합니다. 따라서 COMMIT 및 ROLLBACK 문은 특정 프로시저 범위 내의 작업에만 영향을 줍니다.
SnowConvert 는 COMMIT 또는 ROLLBACK 문이 포함된 프로시저 호출을 감지하면 이 FDM 경고를 생성합니다.
코드 예제¶
입력 코드:¶
CREATE OR REPLACE PROCEDURE inner_transaction_procedure(a int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
ROLLBACK;
INSERT INTO transaction_values_test values (a + 1);
END
$$;
CREATE OR REPLACE PROCEDURE outer_transaction_procedure(a int)
LANGUAGE plpgsql
AS $$
BEGIN
-- This insert is also affected by the ROLLBACK in inner_transaction_procedure
INSERT INTO transaction_values_test values (a);
CALL inner_transaction_procedure(a + 3);
COMMIT;
END
$$;
CALL outer_transaction_procedure(10);
생성된 코드:¶
CREATE OR REPLACE PROCEDURE inner_transaction_procedure (a int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a);
ROLLBACK;
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a + 1);
COMMIT;
END
$$;
CREATE OR REPLACE PROCEDURE outer_transaction_procedure (a int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
-- This insert is also affected by the ROLLBACK in inner_transaction_procedure
INSERT INTO transaction_values_test
values (:a);
--** SSC-FDM-RS0006 - CALLED PROCEDURE CONTAINS USAGES OF COMMIT/ROLLBACK, MODIFYING THE CURRENT TRANSACTION IN CHILD SCOPES IS NOT SUPPORTED IN SNOWFLAKE **
CALL inner_transaction_procedure(:a + 3);
COMMIT;
END
$$;
CALL outer_transaction_procedure(10);
모범 사례¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0007¶
설명¶
Snowflake에서 DDL 문은 실행 후 자동으로 커밋 됩니다. 즉, 현재 트랜잭션의 모든 변경 사항은 영구적으로 적용되며 ROLLBACK 명령을 사용하여 취소할 수 없습니다.
SnowConvert 가 DDL (데이터 정의 언어) 문이 포함된 프로시저에서 ROLLBACK 문을 감지하면 기능 차이 메시지(FDM)를 생성하여 사용자에게 DDL 문의 자동 커밋 동작에 대해 경고합니다.
코드 예제¶
입력 코드:¶
CREATE OR REPLACE PROCEDURE rollback_ddl(a int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO transaction_values_test values (a);
CREATE TABLE someRollbackTable
(
col1 INTEGER
);
INSERT INTO someRollbackTable values (a);
ROLLBACK;
END
$$;
CALL rollback_ddl(10);
생성된 코드:¶
CREATE OR REPLACE PROCEDURE rollback_ddl (a int)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/03/2025", "domain": "test" }}'
AS $$
BEGIN
BEGIN TRANSACTION;
INSERT INTO transaction_values_test
values (:a);
CREATE TABLE someRollbackTable
(
col1 INTEGER
);
BEGIN TRANSACTION;
INSERT INTO someRollbackTable
values (:a);
--** SSC-FDM-RS0007 - DDL STATEMENTS PERFORM AN AUTOMATIC COMMIT, ROLLBACK WILL NOT WORK AS EXPECTED **
ROLLBACK;
END
$$;
CALL rollback_ddl(10);
모범 사례¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-RS0008¶
설명¶
저장 프로시저 내의 각 Snowflake 문은 변경 사항을 자동으로 커밋합니다. 이 동작을 자동 커밋이라고 합니다. 자세한 내용은 Snowflake 설명서 를 참조하십시오.
코드 예제¶
입력 코드:¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC ()
RETURNS VARCHAR
----** SSC-FDM-RS0008 - SNOWFLAKE USES AUTOCOMMIT BY DEFAULT. **
--NONATOMIC
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "02/10/2025", "domain": "test" }}'
AS
$$
BEGIN
NULL;
END;
$$;
모범 사례¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.