Compreensão de como o Snowflake consegue eliminar junções redundantes¶
Em alguns casos, uma junção em uma coluna-chave pode se referir a tabelas que não são necessárias para a junção. Se suas tabelas tiverem colunas-chave e você estiver usando e aplicando as restrições UNIQUE, PRIMARY KEY e FOREIGN KEY, o Snowflake pode melhorar o desempenho das consultas eliminando as junções desnecessárias nas colunas-chave.
Essas otimizações são realizadas somente se você usar a propriedade de restrição RELY para indicar que os dados em suas tabelas obedecem às restrições em torno de chaves primárias e chaves estrangeiras.
Neste tópico:
Configuração da propriedade de restrição RELY para eliminar junções desnecessárias¶
O Snowflake só realiza essa otimização nas junções se você indicar que os dados em suas tabelas obedecem às restrições UNIQUE, PRIMARY KEY e FOREIGN KEY.
Como mencionado em Tipos de restrições com suporte, o Snowflake não aplica as restrições UNIQUE, PRIMARY KEY e FOREIGN KEY. Você é responsável pela aplicação dessas restrições aos dados da tabela.
Se você garantiu que os dados obedecem a essas restrições e deseja que o Snowflake elimine junções desnecessárias, defina a propriedade de restrição RELY nas restrições UNIQUE, PRIMARY KEY e FOREIGN KEY.
Nota
Você é responsável por manter a integridade de suas restrições (UNIQUE, PRIMARY KEY e FOREIGN KEY). Se a integridade de suas restrições não for mantida, os resultados da consulta poderão ser diferentes se a propriedade de restrição RELY for definida (em comparação com os resultados com NORELY).
Exemplos de eliminação de junções desnecessárias¶
Os exemplos a seguir demonstram casos em que o Snowflake elimina junções e referências a tabelas que não são necessárias:
Exemplo 1: eliminação de uma junção externa esquerda desnecessária
Exemplo 3: eliminação de uma junção desnecessária em uma chave primária e chave estrangeira
Nesses exemplos:
dim_products
é uma tabela que contém uma linha para cada produto disponível para compra.Nessa tabela,
product_id
é uma coluna que identifica de forma única um produto.fact_sales
é uma tabela que contém uma linha para cada venda de um produto.Nessa tabela,
product_id
é uma coluna que identifica o produto que foi vendido. As IDs nessa coluna correspondem às IDs na colunaproduct_id
da tabeladim_products
.
Exemplo 1: eliminação de uma junção externa esquerda desnecessária¶
Este é um exemplo de uma junção externa esquerda desnecessária que o Snowflake pode otimizar:
SELECT f.*
FROM fact_sales f
LEFT OUTER JOIN dim_products p
ON f.product_id = p.product_id;
A junção é desnecessária porque a instrução não se refere a nenhuma coluna da tabela dim_products
à direita (exceto a coluna-chave primária da junção).
Se a coluna dim_products.product_id
tiver a restrição UNIQUE ou PRIMARY KEY com a propriedade RELY, o Snowflake consegue identificar essa junção como desnecessária e pode eliminar a referência à tabela dim_products
à direita.
Exemplo 2: eliminação de uma autojunção desnecessária¶
Este é um exemplo de uma autojunção desnecessária que o Snowflake pode otimizar:
SELECT p1.product_id, p2.product_name
FROM dim_products p1, dim_products p2
WHERE p1.product_id = p2.product_id;
A instrução une desnecessariamente a tabela dim_products
consigo mesma e seleciona colunas dessa tabela.
Se a coluna dim_products.product_id
tiver a restrição UNIQUE ou PRIMARY KEY com a propriedade RELY, o Snowflake consegue identificar essa junção como desnecessária e pode eliminar a referência à tabela dim_products
à direita.
Exemplo 3: eliminação de uma junção desnecessária em uma chave primária e chave estrangeira¶
Este é um exemplo de uma junção interna desnecessária que o Snowflake pode otimizar:
SELECT p.product_id, f.units_sold
FROM fact_sales f, dim_products p
WHERE f.product_id = p.product_id;
A instrução não se refere a nenhuma coluna da tabela dim_products
à direita, além da coluna-chave primária da junção.
Se a coluna dim_products.product_id
tiver a restrição PRIMARY KEY e a coluna fact_sales.product_id
tiver a restrição FOREIGN KEY, o Snowflake pode identificar essa junção como desnecessária e pode eliminar a referência à tabela dim_products
à direita.