SnowConvert AI – Funktionale Unterschiede bei RedShift

SSC-FDM-RS0001

Data storage option is not supported in Snowflake. Data distribution is automatically handled by Snowflake.

Beschreibung

In Snowflake ist es nicht notwendig, SORTKEY und DISTSTYLE bei der Migration von RedShift explizit zu definieren, da die Architektur von Snowflake die Datenverteilung und Optimierung intern verwaltet. Snowflake führt die Partitionierung und Indizierung der Daten automatisch aus und optimiert so die Abfrageleistung, ohne dass diese Parameter manuell konfiguriert werden müssen.

Codebeispiel

Eingabecode:
Redshift
 CREATE TABLE table1 (
    col1 INTEGER
)
DISTSTYLE AUTO;

CREATE TABLE table2 (
    col1 INTEGER
)
SORTKEY AUTO;
Generierter Code:
Snowflake
 CREATE TABLE table1 (
    col1 INTEGER
)
----** SSC-FDM-RS0001 - DISTSTYLE AUTO OPTION IS NOT SUPPORTED IN SNOWFLAKE. 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 IS NOT SUPPORTED IN SNOWFLAKE. 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" }}';

Best Practices

  • Es ist ratsam, die Verwendung von CLUSTER BY in Snowflake während der Migration von RedShift zu bewerten, da es die Abfrageleistung verbessern kann, indem es die Datenlokalität für häufig abgefragte Spalten optimiert.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-RS0002

The performance of CLUSTER BY in Snowflake may vary compared to the performance of SORTKEY in Redshift.

Beschreibung

SORTKEY (ausgenommen SORTKEY AUTO) in Amazon RedShift sind analog zu CLUSTER BY in Snowflake. Die Auswirkungen auf die Leistung können jedoch aufgrund von architektonischen Unterschieden zwischen RedShift und Snowflake variieren.

  • SORTKEY verbessert die Leistung, indem Daten in einer sortierten Reihenfolge auf der Grundlage bestimmter Spalten gepflegt werden. Dies ist besonders vorteilhaft für Bereichsabfragen und Sortieroperationen.

  • CLUSTER BY in Snowflake organisiert Daten in Blöcken, die auf bestimmten Spalten basieren, und hilft so bei Filter- und Aggregationsaufgaben. Allerdings ist das Sortieren im Vergleich zu SORTKEY streng.

Das Verständnis dieser Mechanismen ist entscheidend für die Optimierung der Leistung auf der jeweiligen Plattform.

Codebeispiel

Eingabecode:
Redshift
 CREATE TABLE table1 (
    col1 INTEGER
)
SORTKEY (col1);

CREATE TABLE table2 (
    col1 INTEGER SORTKEY
);
Generierter Code:
Snowflake
 CREATE TABLE table1 (
    col1 INTEGER
)
--** SSC-FDM-RS0002 - THE PERFORMANCE OF CLUSTER BY IN SNOWFLAKE MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY IN REDSHIFT **
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 CLUSTER BY IN SNOWFLAKE MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY IN REDSHIFT **
CLUSTER BY (col1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}';

Best Practices

  • Benchmark after migration: Run representative queries on both platforms to compare performance, as CLUSTER BY uses micro-partitioning rather than physical sort order.

  • Consider automatic clustering: For large tables with frequent queries on specific columns, enable automatic clustering in Snowflake.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-RS0003

Pending SnowConvert AI translation for Redshift foreign key constraints.

Beschreibung

Pending SnowConvert AI translation for Redshift foreign key constraints. Snowflake supports foreign key constraints, but they are not enforced and serve only as referential integrity metadata. This is a SnowConvert AI limitation, not a Snowflake platform limitation.

Codebeispiel

Eingabecode:
Redshift
 CREATE TABLE TABLE1 (
    id INTEGER,
    PRIMARY KEY (id)
);

CREATE TABLE TABLE2 (
	id INTEGER,
	id_table1 INTEGER,
	FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
);
Generierter Code:
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 - PENDING SNOWCONVERT AI TRANSLATION FOR REDSHIFT FOREIGN KEY CONSTRAINTS. **
--	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" }}';

Best Practices

  • Sie können mit Fremdschlüsseln manuell Tabellen ändern und diese hinzufügen.

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

SSC-FDM-RS0004

Es ist möglich, dass das Datum falsch ist und Snowflake akzeptiert keine falschen Daten.

Beschreibung

In Snowflake führt die Verwendung von TO_DATE mit einer ungültigen Datumszeichenfolge (wie „20010631“) zu einem Fehler, da diese eine strenge Validierung erzwingt und alle nicht vorhandenen Datumsangaben ablehnt. Im Gegensatz dazu, kann TO_DATE in RedShift solche ungültigen Daten an das nächste gültige Datum anpassen (z. B. Ändern von 31. Juni auf 1. Juli), wenn der Parameter is_strict auf „false“ gesetzt ist. Dieser Unterschied macht deutlich, wie Snowflake die Datenintegrität priorisiert, indem ungültige Daten nicht automatisch korrigiert werden, während RedShift mehr Flexibilität bei der Verwendung von Daten ermöglicht.

Codebeispiel

Eingabecode:
Redshift
 SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
Generierter Code:
Snowflake
 SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');

Best Practices

  • Überprüfen Sie, ob das Datum in TRY_TO_DATE() korrekt ist.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-RS0005

Redshift MERGE rejects duplicate source rows. Snowflake allows them, which may produce different results.

Beschreibung

In Redshift, the MERGE statement throws an error when the source table contains duplicate rows matching the join condition. Snowflake allows MERGE to execute with duplicate source rows, which may produce non-deterministic results when multiple source rows match the same target row.

Codebeispiel

Eingabecode:
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);
Generierter Code:
Snowflake
 --** SSC-FDM-RS0005 - REDSHIFT MERGE STATEMENT REJECTS DUPLICATE SOURCE ROWS. SNOWFLAKE ALLOWS DUPLICATES, WHICH MAY PRODUCE NON-DETERMINISTIC RESULTS. **
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

Best Practices

  • Deduplicate source data: Add a QUALIFY ROW_NUMBER() OVER (PARTITION BY join_key ORDER BY ...) = 1 to the source subquery to ensure each target row matches at most one source row.

  • Validate results: After migration, compare MERGE output row counts between Redshift and Snowflake to detect non-deterministic behavior.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-RS0006

Called procedure contains usages of COMMIT/ROLLBACK. Modifying the current transaction in child scopes is not supported in Snowflake.

Beschreibung

In RedShift ist es zulässig, innerhalb einer Prozedur COMMIT- und ROLLBACK-Anweisungen zu verwenden, um Änderungen einer Transaktion, die in einem äußeren Scope geöffnet wurde, dauerhaft zu übernehmen oder zu verwerfen.

Snowflake arbeitet mit dem Konzept der bereichsbezogenen Transaktionen, bei dem jeder Prozeduraufruf als eigene Transaktion behandelt wird. Dadurch sind die Auswirkungen von COMMIT- und ROLLBACK-Anweisungen auf den Scope der Prozedur beschränkt, in der sie deklariert sind.

Der oben genannte funktionale Unterschied wird mit dieser FDM angezeigt, wenn SnowConvert Aufrufe einer Prozedur erkennt, die COMMIT- oder ROLLBACK-Anweisungen enthält.

Codebeispiel

Eingabecode:
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);
Generierter Code:
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);

Best Practices

  • Refactor transaction control: Move COMMIT and ROLLBACK statements into the outermost procedure or use scoped transactions where supported.

  • Use caller’s rights: Ensure the calling procedure manages the transaction boundary, as Snowflake’s scoped transactions isolate child procedure changes.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-RS0007

DDL statements perform an automatic COMMIT in Snowflake. ROLLBACK will not undo DDL-committed changes.

Beschreibung

In Snowflake führen DDL-Anweisungen nach ihrer Ausführung automatisch ein COMMIT aus und machen damit alle Änderungen der aktuellen Transaktion dauerhaft. Das bedeutet, dass diese Änderungen nicht durch ein ROLLBACK rückgängig gemacht werden können.

Wenn in einer Prozedur eine ROLLBACK-Anweisung gefunden wird, die zusätzlich eine DDL-Anweisung enthält, generiert SnowConvert AI diese FDM, um auf das Autocommit-Verhalten von DDL-Anweisungen hinzuweisen.

Codebeispiel

Eingabecode:
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);
Generierter Code:
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 IN SNOWFLAKE. ROLLBACK WILL NOT UNDO DDL-COMMITTED CHANGES **
    ROLLBACK;
END
$$;

CALL rollback_ddl(10);

Best Practices

  • Separate DDL from DML transactions: Move DDL statements outside the transaction block, or execute them before BEGIN TRANSACTION to avoid implicit commits affecting DML operations.

  • Use conditional logic: If DDL creation is conditional, check for object existence with IF NOT EXISTS to avoid unnecessary autocommits.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-RS0008

Snowflake uses autocommit by default. The NONATOMIC option is not supported in Snowflake.

Beschreibung

In Redshift, the NONATOMIC option on CREATE PROCEDURE allows individual statements within the procedure to commit independently. In Snowflake, autocommit is the default behavior — each statement is automatically committed unless wrapped in an explicit BEGIN TRANSACTION block. The NONATOMIC keyword is removed during migration because Snowflake’s autocommit provides equivalent semantics.

Codebeispiel

Eingabecode:
Redshift
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Generierter Code:
Snowflake
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC ()
RETURNS VARCHAR
----** SSC-FDM-RS0008 - SNOWFLAKE USES AUTOCOMMIT BY DEFAULT. THE NONATOMIC OPTION IS NOT SUPPORTED IN SNOWFLAKE. **
--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;
$$;

Best Practices

  • Verify transaction behavior: If the original Redshift procedure relied on NONATOMIC for partial commits, test the migrated Snowflake procedure to confirm that autocommit provides the expected semantics.

  • Add explicit transactions where needed: If you need atomic (all-or-nothing) behavior for a group of statements in Snowflake, wrap them in BEGIN TRANSACTIONCOMMIT.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.