SnowConvert : différences fonctionnelles de Redshift

SSC-FDM-RS0001

Description

Snowflake gère automatiquement la distribution et l’optimisation des données, contrairement à Redshift. Lors de la migration de Redshift vers Snowflake, vous n’avez pas besoin de spécifier les paramètres SORTKEY et DISTSTYLE car l’architecture de Snowflake gère automatiquement le partitionnement et l’indexation des données afin d’optimiser les performances des requêtes.

Exemple de code

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

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

  • Envisagez d’utiliser CLUSTER BY dans Snowflake lors de la migration depuis Redshift. Cette fonction permet d’améliorer les performances des requêtes en organisant les données en fonction des colonnes auxquelles on accède le plus souvent.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-FDM-RS0002

Description

La commande SORTKEY d’Amazon Redshift (à l’exception de SORTKEY AUTO) a un objectif similaire à la commande CLUSTER BY de Snowflake. Gardez à l’esprit que Redshift et Snowflake ayant des architectures différentes, il se peut que vous obteniez des résultats de performance différents lorsque vous utilisez ces commandes.

  • SORTKEY améliore les performances des requêtes en stockant les données dans une séquence triée en fonction de colonnes spécifiées. Cette fonction est particulièrement utile pour effectuer des requêtes basées sur des plages et des opérations de tri.

  • CLUSTER BY dans Snowflake regroupe les données connexes en micro-partitions basées sur des colonnes sélectionnées, ce qui améliore les opérations de filtrage et d’agrégation. Contrairement à SORTKEY, elle ne respecte pas l’ordre strict des lignes.

Il est essentiel de comprendre le fonctionnement de ces mécanismes pour obtenir les meilleures performances dans chaque plateforme.

Exemple de code

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

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

Description

La traduction des clés étrangères sera prise en charge dans une prochaine version. Pour plus d’informations sur la fonctionnalité de clé étrangère de Snowflake, veuillez vous référer à la documentation de Snowflake.

Note

Snowflake n’applique pas les contraintes de clé étrangère. Elles ne sont utilisées que pour documenter les relations référentielles entre les tables.

Exemple de code

Code d’entrée :
 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é :
 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

  • Vous pouvez ajouter manuellement des clés étrangères aux tables à l’aide de la commande alter tables.

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

SSC-FDM-RS0004

Description

Snowflake et Redshift traitent différemment les dates non valides dans leurs fonctions TO_DATE :

  • TO_DATE de Snowflake valide strictement les dates et génère une erreur lorsqu’elle reçoit des dates non valides (comme “20010631”). Elle ne tente pas de corriger les dates erronées.

  • La commande TO_DATE de Redshift peut automatiquement ajuster les dates non valides à la date valide la plus proche (par exemple, convertir le 31 juin en 1er juillet) lorsque le paramètre is_strict est défini sur false.

Cette différence montre que Snowflake met l’accent sur l’exactitude des données en rejetant les dates non valides, tandis que Redshift offre des options de traitement de dates plus flexibles.

Exemple de code

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

Meilleures pratiques

  • Vérifiez que le format de la date est correct en utilisant la fonction TRY_TO_DATE().

  • Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-FDM-RS0005

Description

Lors de l’exécution d’une instruction MERGE avec des valeurs en double dans la table source, Redshift et Snowflake gèrent la situation différemment. Alors que Redshift lève une erreur, Snowflake poursuit l’exécution. Le Feature Difference Manager (FDM) alerte les utilisateurs sur cette différence de comportement, car elle peut entraîner des résultats inattendus dans l’instruction MERGE convertie.

Exemple de code

Code d’entrée :
 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é :
 --** 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

Description

Dans Redshift, les procédures peuvent inclure les instructions COMMIT et ROLLBACK afin de sauvegarder ou d’annuler les modifications apportées par une transaction lancée en dehors de la procédure.

Snowflake utilise des opérations scopées, ce qui signifie que chaque appel de procédure fonctionne comme une transaction indépendante. Par conséquent, les instructions COMMIT et ROLLBACK n’affectent que les opérations relevant de leur champ d’application spécifique.

SnowConvert génère cet avertissement FDM lorsqu’il détecte des appels à une procédure contenant des instructions COMMIT ou ROLLBACK.

Exemple de code

Code d’entrée :
 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é :
 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

Description

Dans Snowflake, les instructions DDL sont automatiquement validées après leur exécution. Cela signifie que toutes les modifications apportées à la transaction en cours deviennent permanentes et ne peuvent pas être annulées à l’aide d’une commande ROLLBACK.

Lorsque SnowConvert détecte une instruction ROLLBACK dans une procédure qui comprend une instruction DDL (langage de définition des données), il génère un message de différence de fonction (FDM) pour alerter les utilisateurs sur le comportement de validation automatique des instructions DDL.

Exemple de code

Code d’entrée :
 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é :
 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

Description

Chaque instruction Snowflake au sein d’une procédure stockée valide automatiquement ses modifications. Ce comportement est connu sous le nom de validation automatique. Pour plus de détails, voir la documentation de Snowflake.

Exemple de code

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