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" }}';
ベストプラクティス¶
頻繁にクエリされる列のデータローカリティを最適化することで、クエリパフォーマンスを改善できる可能性があるため、Redshiftからの移行中にSnowflakeで
CLUSTER BYの使用を評価することをお勧めします。さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください
SSC-FDM-RS0002¶
CLUSTER BYのパフォーマンスは、ソートキーのパフォーマンスと比較して異なる場合があります。
説明¶
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では、 TO_DATE を無効な日付文字列(「20010631」など)で使用するとエラーになります。これは、Snowflakeが厳密な検証を実施し、存在しない日付を拒否するためです。対照的に、 is_strict パラメーターがfalseに設定されている場合、Redshiftの TO_DATE は、そのような無効な日付を最も近い有効な日付に調整することができます(例えば、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ステートメントの効果は、それらが宣言されているプロシージャのスコープに制限されます。
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);
生成されたコード:¶
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によって破棄することはできません。
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);
生成されたコード:¶
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 までメールでお問い合わせください