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;
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" }}';
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
);
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" }}';
Meilleures pratiques¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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)
);
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" }}';
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)
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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ètreis_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);
Code généré :¶
SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
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);
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);
Meilleures pratiques¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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);
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);
Meilleures pratiques¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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);
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);
Meilleures pratiques¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
$$;
Meilleures pratiques¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com