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:

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 coluna product_id da tabela dim_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;
Copy

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

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

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.