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;
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" }}';
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 zuSORTKEY
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
);
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" }}';
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
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)
);
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" }}';
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)
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
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 Parameteris_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);
Generierter Code:¶
SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
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);
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);
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
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);
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);
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
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);
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);
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
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;
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;
$$;
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com