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

ベストプラクティス

  • Redshiftから移行する際は、Snowflakeで 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 TABLE TABLE2 ADD CONSTRAINT
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
Copy

SSC-FDM-RS0004

説明

SnowflakeとRedshiftでは、 TO_DATE 関数で無効な日付の扱いが異なります。

  • Snowflakeの TO_DATE は、日付を厳密に検証し、無効な日付(「20010631」など)が指定された場合はエラーをスローします。不正確な日付を修正しようとはしません。

  • Redshiftの TO_DATE は、 is_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 コマンドを使っても元に戻せなくなることを意味します。

DDL (データ定義言語)ステートメントを含むプロシージャ内で ROLLBACK ステートメントを SnowConvert が検出すると、 DDL ステートメントの自動コミット動作についてユーザーに警告するための機能差メッセージ(FDM)が生成されます。

コード例

入力コード:
 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

ベストプラクティス