SnowConvert AI - Différences fonctionnelles Redshift

SSC-FDM-RS0001

Option non prise en charge. Le stockage de données est automatiquement géré par Snowflake.

Description

Dans Snowflake, il n’est pas nécessaire de définir explicitement SORTKEY et DISTSTYLE lors de la migration depuis Redshift, car l’architecture de Snowflake gère de manière inhérente la distribution et l’optimisation des données. Snowflake gère automatiquement le partitionnement et l’indexation des données, optimisant les performances des requêtes sans qu’il ne soit nécessaire de configurer manuellement ces paramètres.

Exemple de code

Code d’entrée :
Redshift
 CREATE TABLE table1 (
    col1 INTEGER
)
DISTSTYLE AUTO;

CREATE TABLE table2 (
    col1 INTEGER
)
SORTKEY AUTO;
Copy
Code généré :
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" }}';
Copy

Meilleures pratiques

  • Il est conseillé d’évaluer l’utilisation de CLUSTER BY dans Snowflake lors de la migration depuis Redshift, car elle peut améliorer les performances des requêtes en optimisant la localité des données pour les colonnes fréquemment interrogées.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-RS0002

Les performances de CLUSTER BY peuvent varier par rapport aux performances des Sortkey.

Description

Les SORTKEY (à l’exception de SORTKEY AUTO) dans Amazon Redshift sont analogues à CLUSTER BY dans Snowflake. Cependant, les implications en termes de performances peuvent varier en raison des différences architecturales entre Redshift et Snowflake.

  • SORTKEY améliore les performances en conservant les données dans un ordre trié en fonction de colonnes spécifiées. Cela est particulièrement avantageux pour les requêtes portant sur des intervalles et les opérations d’ordre.

  • CLUSTER BY dans Snowflake organise les données en blocs en fonction de colonnes désignées, facilitant ainsi les tâches de filtrage et d’agrégation. Cependant, l’ordre est moins strict par rapport à SORTKEY.

La compréhension de ces mécanismes est essentielle pour optimiser les performances dans chaque plateforme respective.

Exemple de code

Code d’entrée :
Redshift
 CREATE TABLE table1 (
    col1 INTEGER
)
SORTKEY (col1);

CREATE TABLE table2 (
    col1 INTEGER SORTKEY
);
Copy
Code généré :
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" }}';
Copy

Meilleures pratiques

SSC-FDM-RS0003

La traduction des clés étrangères sera prise en charge à l’avenir.

Description

La traduction des clés étrangères sera transformée à l’avenir. La documentation relative aux clés étrangères dans Snowflake est accessible ici.

Note

Dans Snowflake, la contrainte de clé étrangère n’est pas appliquée et est utilisée pour l’intégrité référentielle.

Exemple de code

Code d’entrée :
Redshift
 CREATE TABLE TABLE1 (
    id INTEGER,
    PRIMARY KEY (id)
);

CREATE TABLE TABLE2 (
	id INTEGER,
	id_table1 INTEGER,
	FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
);
Copy
Code généré :
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" }}';
Copy

Meilleures pratiques

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

SSC-FDM-RS0004

Il est possible que la date soit erronée et que Snowflake n’accepte pas les dates erronées.

Description

Dans Snowflake, l’utilisation de TO_DATE avec une chaîne de date non valide (comme « 20010631 ») entraîne une erreur, car elle impose une validation stricte, rejetant toute date inexistante. En revanche, TO_DATE de Redshift peut ajuster ces dates non valides à la date valide la plus proche (par exemple, en passant du 31 juin au 1er juillet) si le paramètre is_strict est défini sur faux. Cette différence met en évidence la façon dont Snowflake donne la priorité à l’intégrité des données en ne corrigeant pas automatiquement les dates non valides, tandis que Redshift permet une plus grande flexibilité dans la gestion des dates.

Exemple de code

Code d’entrée :
Redshift
 SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
Copy
Code généré :
Snowflake
 SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
Copy

Meilleures pratiques

  • Vérifiez que la date est valide dans TRY_TO_DATE().

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-RS0005

Les doublons ne sont pas autorisés dans la table source.

Description

Dans Redshift, l’instruction MERGE génère une erreur lorsque la table source a des valeurs en double. Snowflake ne renvoie pas l’erreur et autorise l’exécution de la requête à la place. Le FDM avertit de ce comportement, qui pourrait modifier le résultat dans le MERGE converti.

Exemple de code

Code d’entrée :
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);
Copy
Code généré :
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);
Copy

Meilleures pratiques

SSC-FDM-RS0006

La procédure appelée contient des utilisations de COMMIT/ROLLBACK. La modification de la transaction actuelle dans les portées enfants n’est pas prise en charge dans Snowflake.

Description

Dans Redshift, il est autorisé d’utiliser les instructions COMMIT et ROLLBACK à l’intérieur d’une procédure pour rendre permanentes ou ignorer les modifications sur une transaction qui a été ouverte sur une portée extérieure.

Snowflake fonctionne avec le concept de transactions scopées, qui traite chaque appel de procédure comme une transaction distincte, ce qui limite les effets des instructions COMMIT et ROLLBACK sur la portée de la procédure dans lesquelles elles sont déclarées.

La différence fonctionnelle mentionnée ci-dessus sera signalée par ce FDM lorsque des appels à une procédure avec COMMIT ou ROLLBACK seront détectés par SnowConvert.

Exemple de code

Code d’entrée :
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);
Copy
Code généré :
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);
Copy

Meilleures pratiques

SSC-FDM-RS0007

Les instructions DDL effectuent une COMMIT automatique. ROLLBACK ne fonctionnera pas comme prévu.

Description

Dans Snowflake, [les instructions DDL effectuent une validation automatique] (https://docs.snowflake.com/fr/sql-reference/transactions#ddl) après leur exécution, rendant permanentes toutes les modifications de la transaction en cours, ce qui signifie qu’elles ne peuvent pas être écartées par un ROLLBACK.

Lorsqu’une instruction ROLLBACK sera trouvée dans une procédure qui contient également une instruction DDL, SnowConvert AI générera ce FDM pour signaler le comportement de validation automatique de la DDL.

Exemple de code

Code d’entrée :
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);
Copy
Code généré :
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);
Copy

Meilleures pratiques

SSC-FDM-RS0008

SNOWFLAKE USES AUTOCOMMIT BY DEFAULT.

Description

Les instructions Snowflake à l’intérieur des procédures sont traitées comme une validation automatique. Documentation Snowflake

Exemple de code

Code d’entrée :
Redshift
 CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC 
AS 
$$
    BEGIN
        NULL;
    END;
$$ 
LANGUAGE plpgsql;
Copy
Code généré :
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;
$$;
Copy

Meilleures pratiques