SnowConvert: Redshift-Funktionsunterschiede

SSC-FDM-RS0001

Beschreibung

Im Gegensatz zu Redshift verwaltet Snowflake die Datenverteilung und -optimierung automatisch. Bei der Migration von Redshift zu Snowflake müssen Sie keine SORTKEY- und DISTSTYLE-Parameter angeben, da die Architektur von Snowflake die Datenpartitionierung und -indizierung automatisch übernimmt, um die Abfrageleistung zu optimieren.

Codebeispiel

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

CREATE TABLE table2 (
    col1 INTEGER
)
SORTKEY AUTO;
Copy
Generierter Code:
 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

Best Practices

  • Erwägen Sie die Verwendung von CLUSTER BY in Snowflake, wenn Sie von Redshift migrieren. Mit diesem Feature können Sie die Abfrageleistung verbessern, indem Sie die Daten auf der Grundlage von Spalten organisieren, auf die häufig zugegriffen wird.

  • Wenn Sie weitere Hilfe benötigen, kontaktieren Sie uns unter snowconvert-support@snowflake.com

SSC-FDM-RS0002

Beschreibung

Der Amazon Redshift-Befehl SORTKEY (mit Ausnahme von SORTKEY AUTO) dient einem ähnlichen Zweck wie der Snowflake-Befehl CLUSTER BY. Denken Sie daran, dass Redshift und Snowflake unterschiedliche Architekturen haben und Sie daher bei der Verwendung dieser Befehle unterschiedliche Leistungsergebnisse erzielen können.

  • SORTKEY verbessert die Abfrageleistung, indem Daten in einer nach bestimmten Spalten sortierten Reihenfolge gespeichert werden. Dies ist besonders nützlich, wenn Sie bereichsbasierte Abfragen und Sortiervorgänge durchführen.

  • CLUSTER BY in Snowflake gruppiert zusammenhängende Daten in Mikropartitionen auf der Basis ausgewählter Spalten, was Filter- und Aggregationsoperationen verbessert. Im Gegensatz zu SORTKEY wird keine strenge Zeilenreihenfolge eingehalten.

Das Verständnis der Funktionsweise dieser Mechanismen ist wichtig, um auf jeder Plattform die beste Leistung zu erzielen.

Codebeispiel

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

CREATE TABLE table2 (
    col1 INTEGER SORTKEY
);
Copy
Generierter Code:
 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

Best Practices

SSC-FDM-RS0003

Beschreibung

Die Übersetzung von Fremdschlüsseln wird in einer zukünftigen Version unterstützt werden. Informationen über die Fremdschlüsselfunktionalität von Snowflake finden Sie in der Snowflake-Dokumentation.

Bemerkung

Snowflake erzwingt keine Fremdschlüsseleinschränkungen. Sie werden nur für die Dokumentation von referenziellen Beziehungen zwischen Tabellen verwendet.

Codebeispiel

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

CREATE TABLE TABLE2 (
	id INTEGER,
	id_table1 INTEGER,
	FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
);
Copy
Generierter Code:
 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

Best Practices

  • Mit dem Befehl ALTER TABLES können Sie manuell Fremdschlüssel zu Tabellen hinzufügen.

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

SSC-FDM-RS0004

Beschreibung

Snowflake und Redshift behandeln ungültige Daten in ihren TO_DATE-Funktionen unterschiedlich:

  • TO_DATE von Snowflake überprüft Datumsangaben streng und gibt bei ungültigen Datumsangaben (wie „20010631“) einen Fehler aus. Es wird nicht versucht, falsche Daten zu korrigieren.

  • TO_DATE von Redshift kann ungültige Datumsangaben automatisch an das nächstgelegene gültige Datum anpassen (zum Beispiel den 31. Juni in den 1. Juli umwandeln), wenn der Parameter is_strict auf false gesetzt ist.

Dieser Unterschied zeigt, dass Snowflake den Schwerpunkt auf die Genauigkeit der Daten legt, indem es ungültige Daten zurückweist, während Redshift flexiblere Optionen für die Datumsverarbeitung bietet.

Codebeispiel

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

Best Practices

  • Überprüfen Sie, ob das Datumsformat korrekt ist, indem Sie die Funktion TRY_TO_DATE() verwenden.

  • Wenn Sie weitere Hilfe benötigen, wenden Sie sich bitte an unser Support-Team unter snowconvert-support@snowflake.com.

SSC-FDM-RS0005

Beschreibung

Wenn Sie eine MERGE-Anweisung mit doppelten Werten in der Quelltabelle ausführen, behandeln Redshift und Snowflake die Situation unterschiedlich. Während Redshift einen Fehler meldet, setzt Snowflake die Ausführung fort. Der Feature Difference Manager (FDM) macht Benutzer auf diesen Verhaltensunterschied aufmerksam, da er zu unerwarteten Ergebnissen in der konvertierten MERGE-Anweisung führen kann.

Codebeispiel

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

Best Practices

SSC-FDM-RS0006

Beschreibung

In Redshift können Prozeduren die COMMIT- und ROLLBACK-Anweisung enthalten, um Änderungen, die durch eine außerhalb der Prozedur gestartete Transaktion vorgenommen wurden, entweder zu speichern oder rückgängig zu machen.

Snowflake verwendet bereichsbezogene Transaktionen, was bedeutet, dass jeder Prozeduraufruf wie eine eigenständige Transaktion funktioniert. Daher wirken sich die COMMIT- und ROLLBACK-Anweisungen nur auf die Operationen innerhalb ihres jeweiligen Prozedurbereichs aus.

SnowConvert erzeugt diese FDM-Warnung, wenn es Aufrufe einer Prozedur entdeckt, die COMMIT- oder ROLLBACK-Anweisungen enthält.

Codebeispiel

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

Best Practices

SSC-FDM-RS0007

Beschreibung

In Snowflake wird für DDL-Anweisungen automatisch ein Commit ausgeführt, nachdem sie ausgeführt wurden. Das bedeutet, dass alle Änderungen in der aktuellen Transaktion dauerhaft werden und nicht mit einem ROLLBACK-Befehl rückgängig gemacht werden können.

Wenn SnowConvert eine ROLLBACK-Anweisung in einer Prozedur erkennt, die eine DDL-Anweisung (Data Definition Language) enthält, erzeugt es eine Featuredifferenzmeldung (Feature Difference Message, FDM), um die Benutzer darüber zu informieren, dass für die DDL-Anweisungen ein automatischer Commit erfolgt.

Codebeispiel

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

Best Practices

SSC-FDM-RS0008

Beschreibung

Für jede Änderung einer Snowflake-Anweisung in einer gespeicherten Prozedur erfolgt ein automatischer Commit. Dieses Verhalten wird als Autocommit bezeichnet. Weitere Informationen dazu finden Sie in der Snowflake-Dokumentation.

Codebeispiel

Eingabecode:
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
Generierter Code:
 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

Best Practices