SnowConvert AI – Diferenças funcionais do Redshift¶
SSC-FDM-RS0001¶
Opção não compatível. O armazenamento de dados é gerenciado automaticamente pelo Snowflake.
Descrição¶
No Snowflake, não é necessário definir explicitamente SORTKEY e DISTSTYLE ao migrar do Redshift, pois a arquitetura do Snowflake gerencia de modo inerente a distribuição e a otimização de dados. O Snowflake lida automaticamente com o particionamento e a indexação de dados, otimizando o desempenho das consultas sem exigir a configuração manual desses parâmetros.
Exemplo de código¶
Código de entrada:¶
Redshift¶
CREATE TABLE table1 (
col1 INTEGER
)
DISTSTYLE AUTO;
CREATE TABLE table2 (
col1 INTEGER
)
SORTKEY AUTO;
Código gerado:¶
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" }}';
Práticas recomendadas¶
É recomendável avaliar o uso de
CLUSTERBYno Snowflake durante a migração do Redshift, pois isso pode melhorar o desempenho das consultas, otimizando a localidade dos dados para colunas consultadas com frequência.Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0002¶
O desempenho de CLUSTER BY pode variar em comparação com o desempenho de Sortkey.
Descrição¶
SORTKEY (excluindo SORTKEY AUTO) no Amazon Redshift são análogos ao CLUSTER BY no Snowflake. No entanto, as implicações de desempenho podem variar devido às diferenças arquitetônicas entre o Redshift e o Snowflake.
SORTKEYmelhora o desempenho mantendo os dados em ordem classificada com base em colunas especificadas. Isso é particularmente útil para consultas de intervalo e operações de ordenação.O
CLUSTER BYno Snowflake organiza os dados em blocos com base em colunas designadas, auxiliando em tarefas de filtragem e agregação. No entanto, ele é menos rigoroso quanto à ordenação em comparação comSORTKEY.
Compreender esses mecanismos é crucial para otimizar o desempenho em cada plataforma respectiva.
Exemplo de código¶
Código de entrada:¶
Redshift¶
CREATE TABLE table1 (
col1 INTEGER
)
SORTKEY (col1);
CREATE TABLE table2 (
col1 INTEGER SORTKEY
);
Código gerado:¶
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" }}';
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0003¶
A tradução de chaves estrangeiras será compatível no futuro.
Descrição¶
A tradução de chaves estrangeiras será transformada no futuro. A documentação sobre chaves estrangeiras no Snowflake pode ser acessada aqui.
Nota
No Snowflake, a restrição de chave estrangeira não é imposta e é utilizada para integridade referencial.
Exemplo de código¶
Código de entrada:¶
Redshift¶
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:¶
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" }}';
Práticas recomendadas¶
Você pode alterar tabelas manualmente com chaves estrangeiras e adicioná-las.
ALTER TABLE TABLE2 ADD CONSTRAINT
FOREIGN KEY (id_table1) REFERENCES TABLE1 (col1)
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0004¶
É possível que a data esteja incorreta e o Snowflake não aceita datas incorretas.
Descrição¶
No Snowflake, usar TO_DATE com uma cadeia de caracteres de data inválida (como «20010631») resulta em um erro porque ele impõe uma validação estrita, rejeitando qualquer data inexistente. Em contraste, TO_DATE do Redshift pode ajustar essas datas inválidas para a data válida mais próxima (por exemplo, de 31 de junho para 1º de julho) se o parâmetro is_strict estiver definido como falso. Essa diferença destaca como o Snowflake prioriza a integridade dos dados ao não corrigir automaticamente datas inválidas, enquanto o Redshift permite mais flexibilidade no tratamento de datas.
Exemplo de código¶
Código de entrada:¶
Redshift¶
SELECT TO_DATE('20010631', 'YYYYMMDD', FALSE);
Código gerado:¶
Snowflake¶
SELECT
TRY_TO_DATE(/*** SSC-FDM-RS0004 - INVALID DATES WILL CAUSE ERRORS IN SNOWFLAKE ***/ '20010631', 'YYYYMMDD');
Práticas recomendadas¶
Verifique se a data é válida em TRY_TO_DATE().
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0005¶
Duplicatas não permitidas na tabela de origem
Descrição¶
No Redshift, a instrução MERGE gera um erro quando a tabela de origem tem valores duplicados. O Snowflake não gera o erro e, em vez disso, permite a execução da consulta. A FDM alerta sobre esse comportamento, que pode alterar o resultado na instrução MERGE convertida.
Exemplo de código¶
Código de entrada:¶
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);
Código gerado:¶
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);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0006¶
O procedimento chamado contém usos de COMMIT/ROLLBACK, e a modificação da transação atual em escopos filhos não é compatível com o Snowflake.
Descrição¶
No Redshift, é permitido usar as instruções COMMIT e ROLLBACK dentro de um procedimento para tornar permanentes ou descartar as alterações em uma transação que foi aberta em um escopo externo.
O Snowflake trabalha com o conceito de transações com escopo, que trata cada chamada de procedimento como uma transação separada. Isso limita os efeitos das instruções COMMIT e ROLLBACK ao escopo do procedimento em que são declaradas.
A diferença funcional mencionada será alertada com esta FDM quando chamadas a um procedimento com COMMIT ou ROLLBACK forem detectadas pelo SnowConvert.
Exemplo de código¶
Código de entrada:¶
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);
Código gerado:¶
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);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0007¶
As instruções DDL executam um COMMIT automático; ROLLBACK não funcionará como esperado.
Descrição¶
No Snowflake, as instruções DDL executam um commit automático após a execução delas, tornando permanentes todas as alterações na transação atual, o que significa que elas não podem ser descartadas por uma ROLLBACK.
Quando uma instrução ROLLBACK é encontrada em um procedimento que também contém uma instrução DDL, o SnowConvert AI gera esta FDM para informar sobre o comportamento da confirmação automática da DDL.
Exemplo de código¶
Código de entrada:¶
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);
Código gerado:¶
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);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-RS0008¶
SNOWFLAKE USES AUTOCOMMIT BY DEFAULT.
Descrição¶
As instruções do Snowflake dentro de procedimentos são tratadas como confirmação automática. Documentação do Snowflake
Exemplo de código¶
Código de entrada:¶
Redshift¶
CREATE OR REPLACE PROCEDURE SP_NONATOMIC()
NONATOMIC
AS
$$
BEGIN
NULL;
END;
$$
LANGUAGE plpgsql;
Código gerado:¶
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;
$$;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com