SnowConvert AI - Redshiftの機能の違い

SSC-FDM-RS0001

オプションはサポートされていません。データの保存はSnowflakeが自動的に行います。

説明

Snowflakeでは、Snowflakeのアーキテクチャが本質的にデータの分散と最適化を管理するため、Redshiftからの移行時に SORTKEYDISTSTYLE を明示的に定義する必要はありません。Snowflakeはデータパーティショニングとインデックス作成を自動的に処理し、これらのパラメータを手動で設定することなくクエリパフォーマンスを最適化します。

コード例

入力コード:
Redshift
 CREATE TABLE table1 (
    col1 INTEGER
)
DISTSTYLE AUTO;

CREATE TABLE table2 (
    col1 INTEGER
)
SORTKEY AUTO;
Copy
生成されたコード:
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" }}';
Copy

ベストプラクティス

  • 頻繁にクエリされる列のデータローカリティを最適化することで、クエリパフォーマンスを改善できる可能性があるため、Redshiftからの移行中にSnowflakeで CLUSTER BY の使用を評価することをお勧めします。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください

SSC-FDM-RS0002

CLUSTER BYのパフォーマンスは、ソートキーのパフォーマンスと比較して異なる場合があります。

説明

Amazon Redshiftの SORTKEYSORTKEY 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
);
Copy
生成されたコード:
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" }}';
Copy

ベストプラクティス

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)
);
Copy
生成されたコード:
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" }}';
Copy

ベストプラクティス

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

SSC-FDM-RS0004

日付が間違っている可能性があり、Snowflakeは間違った日付を受け付けません。

説明

Snowflakeでは、 TO_DATE を無効な日付文字列(「20010631」など)で使用するとエラーになります。これは、Snowflakeが厳密な検証を実施し、存在しない日付を拒否するためです。対照的に、 is_strict パラメーターがfalseに設定されている場合、Redshiftの TO_DATE は、そのような無効な日付を最も近い有効な日付に調整することができます(例えば、6月31日を7月1日にローリングします)。この違いは、Snowflakeが無効な日付を自動的に修正しないことでデータの整合性を優先しているのに対して、Redshiftは日付の取り扱いに柔軟性を持たせていることを浮き彫りにしています。

コード例

入力コード:
Redshift
 SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
Copy
生成されたコード:
Snowflake
 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

ソーステーブルで重複は許可されません

説明

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);
Copy
生成されたコード:
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);
Copy

ベストプラクティス

SSC-FDM-RS0006

コールされたプロシージャは、COMMIT/ROLLBACKの使用を含み、子スコープで現在のトランザクションを変更することはSnowflakeではサポートされていません。

説明

Redshiftでは、外部スコープでオープンされたトランザクションの変更を永続化または破棄するために、プロシージャ内でCOMMITおよびROLLBACKステートメントを使用することが許可されています。

Snowflakeは スコープトランザクション の概念で動作し、各プロシージャコールを個別のトランザクションとして扱います。これにより、COMMITとROLLBACKステートメントの効果は、それらが宣言されているプロシージャのスコープに制限されます。

COMMITまたはROLLBACKを持つ手続きへの呼び出しがSnowConvertによって検出された場合、前述の機能差はこの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);
Copy
生成されたコード:
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);
Copy

ベストプラクティス

SSC-FDM-RS0007

DDLステートメントが自動的にCOMMITを実施し、ROLLBACKは期待通りに機能しません

説明

Snowflakeでは、 DDLステートメントが実行後に自動コミット を実行し、現在のトランザクションのすべての変更を永続化します。つまり、ROLLBACKによって破棄することはできません。

ROLLBACKステートメントを含むプロシージャにDDLステートメントがあると、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);
Copy
生成されたコード:
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);
Copy

ベストプラクティス

SSC-FDM-RS0008

SNOWFLAKE USES AUTOCOMMIT BY DEFAULT.

説明

プロシージャ内のSnowflake ステートメントは自動コミットとして扱われます。 Snowflakeドキュメント

コード例

入力コード:
Redshift
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
生成されたコード:
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;
$$;
Copy

ベストプラクティス