SnowConvert AI - Redshift 기능적 차이¶
SSC-FDM-RS0001¶
옵션이 지원되지 않습니다. 데이터 저장소는 Snowflake에서 자동으로 처리됩니다.
설명¶
Snowflake의 아키텍처는 본질적으로 데이터 분포와 최적화를 관리하기 때문에 Snowflake에서는 Redshift에서 마이그레이션할 때 SORTKEY 및 DISTSTYLE을 명시적으로 정의할 필요가 없습니다. Snowflake는 데이터 파티셔닝 및 인덱싱을 자동으로 처리하여 이러한 매개 변수를 수동으로 구성할 필요 없이 쿼리 성능을 최적화합니다.
코드 예제¶
입력 코드:¶
Redshift¶
CREATE TABLE table1 (
col1 INTEGER
)
DISTSTYLE AUTO;
CREATE TABLE table2 (
col1 INTEGER
)
SORTKEY AUTO;
생성된 코드:¶
Snowflake¶
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" }}';
모범 사례¶
CLUSTER BY는 자주 쿼리되는 열의 데이터 지역성을 최적화하여 쿼리 성능을 향상시킬 수 있기 때문에 Redshift에서 마이그레이션하는 동안 Snowflake에서 사용하는 것이 좋습니다.추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-RS0002¶
CLUSTER BY의 성능은 Sortkey의 성능과 비교할 때 다를 수 있습니다.
설명¶
Amazon Redshift의 SORTKEY(SORTKEY AUTO 제외)는 Snowflake의 CLUSTER BY와 유사합니다. 그러나 Redshift와 Snowflake 간의 아키텍처 차이로 인해 성능에 미치는 영향이 다를 수 있습니다.
**
SORTKEY**는 지정된 열을 기준으로 정렬된 순서로 데이터를 유지 관리하여 성능을 개선합니다. 이는 범위 쿼리 및 순서 지정 작업에 특히 유용합니다.Snowflake의 **
CLUSTER BY**는 지정된 열을 기반으로 데이터를 블록으로 구성하여 필터링 및 집계 작업을 지원합니다. 그러나SORTKEY보다 순서 지정에 엄격하지 않습니다.
이러한 메커니즘을 이해하는 것은 각 플랫폼에서 성능을 최적화하는 데 매우 중요합니다.
코드 예제¶
입력 코드:¶
Redshift¶
CREATE TABLE table1 (
col1 INTEGER
)
SORTKEY (col1);
CREATE TABLE table2 (
col1 INTEGER SORTKEY
);
생성된 코드:¶
Snowflake¶
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에서는 외래 키 제약 조건이 적용되지 않으며 참조 무결성을 위해 사용됩니다.
코드 예제¶
입력 코드:¶
Redshift¶
CREATE TABLE TABLE1 (
id INTEGER,
PRIMARY KEY (id)
);
CREATE TABLE TABLE2 (
id INTEGER,
id_table1 INTEGER,
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
);
생성된 코드:¶
Snowflake¶
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 TABLE TABLE2 ADD CONSTRAINT
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-RS0004¶
날짜가 잘못되었을 수 있으며 Snowflake는 잘못된 날짜를 허용하지 않습니다
설명¶
Snowflake는 엄격한 유효성 검사를 적용하여 존재하지 않는 날짜를 거부하므로 유효하지 않은 날짜 문자열(예: ‘20010631’)이 있는 TO_DATE를 사용하면 오류가 발생합니다. 반면, Redshift의 TO_DATE는 is_strict 매개 변수가 false로 설정된 경우 유효하지 않은 날짜를 가장 가까운 유효한 날짜로 조정할 수 있습니다(예: 6월 31일을 7월 1일로 롤링). 이러한 차이를 통해 Snowflake는 유효하지 않은 날짜를 자동으로 수정하지 않고 데이터 무결성을 우선시하는 반면, Redshift는 날짜 처리에서 더 많은 유연성을 허용한다는 점을 알 수 있습니다.
코드 예제¶
입력 코드:¶
Redshift¶
SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
생성된 코드:¶
Snowflake¶
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¶
소스 테이블에서 중복이 허용되지 않습니다
설명¶
Redshift에서는 소스 테이블에 중복 값이 있는 경우 MERGE 문에서 오류가 발생합니다. Snowflake는 오류를 발생시키지 않고 대신 쿼리 실행을 허용합니다. 이 FDM은 이 동작으로 인해 변환된 MERGE의 결과가 변경될 수 있음을 경고합니다.
코드 예제¶
입력 코드:¶
Redshift¶
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
생성된 코드:¶
Snowflake¶
--** 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¶
호출된 프로시저에 COMMIT 및 ROLLBACK이 사용되며, 하위 범위에서 현재 트랜잭션을 수정하는 기능은 Snowflake에서 지원되지 않습니다
설명¶
Redshift에서는 프로시저 내에서 COMMIT 및 ROLLBACK 문을 사용하여 외부 범위에서 열린 트랜잭션의 변경 사항을 영구적으로 적용하거나 취소할 수 있습니다.
Snowflake는 각 프로시저 호출을 별도의 트랜잭션으로 처리하는 범위 지정 트랜잭션의 개념을 적용하므로, COMMIT 및 ROLLBACK 문의 효과가 해당 문이 선언된 프로시저의 범위로 제한됩니다.
SnowConvert에서 COMMIT 또는 ROLLBACK을 통한 프로시저 호출을 감지하는 경우 이 FDM은 앞서 언급한 기능적 차이에 대한 경고를 표시합니다.
코드 예제¶
입력 코드:¶
Redshift¶
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);
생성된 코드:¶
Snowflake¶
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¶
DDL 문은 자동 COMMIT을 수행하며, ROLLBACK은 예상대로 작동하지 않습니다
설명¶
Snowflake에서는 DDL문이 실행 후 자동 커밋을 수행하여 현재 트랜잭션의 모든 변경 사항을 영구적으로 적용하므로 ROLLBACK으로 취소할 수 없습니다.
DDL 문이 포함된 프로시저에서 ROLLBACK 문도 발견되는 경우 SnowConvert AI는 DDL 자동 커밋 동작에 대해 알리기 위해 이 FDM을 생성합니다.
코드 예제¶
입력 코드:¶
Redshift¶
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);
생성된 코드:¶
Snowflake¶
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 USES AUTOCOMMIT BY DEFAULT.
설명¶
프로시저 내의 Snowflake 문은 자동 커밋으로 처리됩니다. Snowflake 설명서
코드 예제¶
입력 코드:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
생성된 코드:¶
Snowflake¶
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으로 이메일을 보내주세요.