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" }}';
ベストプラクティス¶
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
);
生成されたコード:¶
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 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」など)が指定された場合はエラーをスローします。不正確な日付を修正しようとはしません。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 コマンドを使っても元に戻せなくなることを意味します。
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);
生成されたコード:¶
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 にお問い合わせください