SnowConvert: Redshift 기능 차이점

SSC-FDM-RS0001

설명

Snowflake는 Redshift와 달리 데이터 배포 및 최적화를 자동으로 관리합니다. Redshift에서 Snowflake로 마이그레이션할 때, Snowflake의 아키텍처가 데이터 파티션과 인덱싱을 자동으로 처리하여 쿼리 성능을 최적화하기 때문에 SORTKEYDISTSTYLE 매개 변수를 지정할 필요가 없습니다.

코드 예제

입력 코드:
 CREATE TABLE table1 (
    col1 INTEGER
)
DISTSTYLE AUTO;

CREATE TABLE table2 (
    col1 INTEGER
)
SORTKEY AUTO;
Copy
생성된 코드:
 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" }}';
Copy

모범 사례

  • 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
);
Copy
생성된 코드:
 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" }}';
Copy

모범 사례

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)
);
Copy
생성된 코드:
 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" }}';
Copy

모범 사례

  • alter tables 명령을 사용하여 테이블에 외래 키를 수동으로 추가할 수 있습니다.

 ALTER TABLE TABLE2 ADD CONSTRAINT
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
Copy

SSC-FDM-RS0004

설명

Snowflake와 Redshift는 TO_DATE 함수에서 유효하지 않은 날짜를 다르게 처리합니다.

  • Snowflake의 TO_DATE 는 날짜의 유효성을 엄격하게 검사하고 유효하지 않은 날짜(예: ‘20010631’)가 주어지면 오류를 throw합니다. 잘못된 날짜를 수정하려고 시도하지 않습니다.

  • Redshift의 TO_DATEis_strict 매개 변수가 false로 설정된 경우 유효하지 않은 날짜를 가장 가까운 유효 날짜로 자동 조정(예: 6월 31일을 7월 1일로 변환)할 수 있습니다.

이 차이는 Snowflake가 유효하지 않은 날짜를 거부하여 데이터 정확성을 강조하는 반면, Redshift는 보다 유연한 날짜 처리 옵션을 제공한다는 것을 보여줍니다.

코드 예제

입력 코드:
 SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
Copy
생성된 코드:
 SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
Copy

모범 사례

  • 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);
Copy
생성된 코드:
 --** 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);
Copy

모범 사례

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);
Copy
생성된 코드:
 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);
Copy

모범 사례

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);
Copy
생성된 코드:
 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);
Copy

모범 사례

SSC-FDM-RS0008

설명

저장 프로시저 내의 각 Snowflake 문은 변경 사항을 자동으로 커밋합니다. 이 동작을 자동 커밋이라고 합니다. 자세한 내용은 Snowflake 설명서 를 참조하십시오.

코드 예제

입력 코드:
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
생성된 코드:
 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;
$$;
Copy

모범 사례