SnowConvert: Diferenças funcionais do Redshift¶
SSC-FDM-RS0001¶
Descrição¶
O Snowflake gerencia automaticamente a distribuição e a otimização dos dados, ao contrário do Redshift. Ao migrar do Redshift para o Snowflake, você não precisa especificar os parâmetros SORTKEY
e DISTSTYLE
porque a arquitetura do Snowflake lida com o particionamento e a indexação de dados automaticamente para otimizar o desempenho da consulta.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE table1 (
col1 INTEGER
)
DISTSTYLE AUTO;
CREATE TABLE table2 (
col1 INTEGER
)
SORTKEY AUTO;
Código gerado:¶
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" }}';
Práticas recomendadas¶
Considere o uso de
CLUSTER BY
no Snowflake ao migrar do Redshift. Esse recurso pode melhorar o desempenho da consulta, organizando os dados com base nas colunas mais acessadas.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0002¶
Descrição¶
O comando SORTKEY
do Amazon Redshift (exceto SORTKEY AUTO
) tem uma finalidade semelhante à do comando CLUSTER BY
do Snowflake. Lembre-se de que, como o Redshift e o Snowflake têm arquiteturas diferentes, você poderá ver resultados de desempenho diferentes ao usar esses comandos.
SORTKEY
melhora o desempenho da consulta armazenando dados em uma sequência classificada de acordo com as colunas especificadas. Isso é especialmente útil ao realizar consultas baseadas em intervalos e operações de classificação.CLUSTER BY
no Snowflake agrupa dados relacionados em micropartições com base em colunas selecionadas, o que melhora as operações de filtragem e agregação. Ao contrário doSORTKEY
, ele não mantém uma ordenação estrita das linhas.
Entender como esses mecanismos funcionam é essencial para obter o melhor desempenho em cada plataforma.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE table1 (
col1 INTEGER
)
SORTKEY (col1);
CREATE TABLE table2 (
col1 INTEGER SORTKEY
);
Código gerado:¶
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" }}';
Práticas recomendadas¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0003¶
Descrição¶
A conversão de chaves estrangeiras será suportada em uma versão futura. Para obter informações sobre a funcionalidade de chave estrangeira do Snowflake, consulte a documentação do Snowflake.
Nota
O Snowflake não impõe restrições de chave estrangeira. Eles são usados apenas para documentar relacionamentos referenciais entre tabelas.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE TABLE1 (
id INTEGER,
PRIMARY KEY (id)
);
CREATE TABLE TABLE2 (
id INTEGER,
id_table1 INTEGER,
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
);
Código gerado:¶
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" }}';
Práticas recomendadas¶
Você pode adicionar manualmente chaves estrangeiras às tabelas usando o comando alter tables.
ALTER TABLE TABLE2 ADD CONSTRAINT
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0004¶
Descrição¶
O Snowflake e o Redshift tratam as datas inválidas de forma diferente em suas funções TO_DATE
:
TO_DATE
do Snowflake valida estritamente as datas e gera um erro quando são fornecidas datas inválidas (como «20010631»). Ele não tenta corrigir datas incorretas.TO_DATE
do Redshift pode ajustar automaticamente as datas inválidas para a data válida mais próxima (por exemplo, convertendo 31 de junho para 1º de julho) quando o parâmetrois_strict
estiver definido como false.
Essa diferença mostra que o Snowflake enfatiza a precisão dos dados ao rejeitar datas inválidas, enquanto o Redshift oferece opções mais flexíveis de tratamento de datas.
Exemplo de código¶
Código de entrada:¶
SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
Código gerado:¶
SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
Práticas recomendadas¶
Verifique se o formato da data está correto usando a função TRY_TO_DATE().
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0005¶
Descrição¶
Ao executar uma instrução MERGE com valores duplicados na tabela de origem, o Redshift e o Snowflake tratam a situação de forma diferente. Enquanto o Redshift gera um erro, o Snowflake continua a execução. O Feature Difference Manager (FDM) alerta os usuários sobre essa diferença de comportamento, pois ela pode levar a resultados inesperados na instrução MERGE convertida.
Exemplo de código¶
Código de entrada:¶
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
Código gerado:¶
--** 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);
Práticas recomendadas¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0006¶
Descrição¶
No Redshift, os procedimentos podem incluir as instruções COMMIT e ROLLBACK para salvar ou cancelar as alterações feitas por uma transação que foi iniciada fora do procedimento.
O Snowflake usa transações com escopo, o que significa que cada chamada de procedimento funciona como uma transação independente. Como resultado, as instruções COMMIT e ROLLBACK afetam apenas as operações dentro de seu escopo de procedimento específico.
O SnowConvert gerará esse aviso FDM quando detectar chamadas para um procedimento que contenha instruções COMMIT ou ROLLBACK.
Exemplo de código¶
Código de entrada:¶
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);
Código gerado:¶
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);
Práticas recomendadas¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0007¶
Descrição¶
No Snowflake, as instruções doDDL são confirmadas automaticamente após serem executadas. Isso significa que todas as alterações na transação atual se tornam permanentes e não podem ser desfeitas usando o comando ROLLBACK.
Quando o SnowConvert detecta uma instrução ROLLBACK em um procedimento que inclui uma instrução DDL (Data Definition Language), ele gera uma mensagem de diferença de recurso (FDM) para alertar os usuários sobre o comportamento de confirmação automática das instruções DDL.
Exemplo de código¶
Código de entrada:¶
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);
Código gerado:¶
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);
Práticas recomendadas¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-FDM-RS0008¶
Descrição¶
Cada instrução do Snowflake em um procedimento armazenado confirma automaticamente suas alterações. Esse comportamento é conhecido como autocommit. Para obter mais detalhes, consulte a documentação do Snowflake.
Exemplo de código¶
Código de entrada:¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
Código gerado:¶
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;
$$;
Práticas recomendadas¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com