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;
Copy
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" }}';
Copy

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 do SORTKEY, 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
);
Copy
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" }}';
Copy

Práticas recomendadas

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)
);
Copy
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" }}';
Copy

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)
Copy

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âmetro is_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);
Copy
Código gerado:
 SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
Copy

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);
Copy
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);
Copy

Práticas recomendadas

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);
Copy
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);
Copy

Práticas recomendadas

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);
Copy
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);
Copy

Práticas recomendadas

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;
Copy
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;
$$;
Copy

Práticas recomendadas