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.

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.

Conforme mencionado em Tipos de restrições compatíveis, o Snowflake não impõe restrições UNIQUE, PRIMARY KEY e FOREIGN KEY em tabelas padrão, mas as impõe em tabelas híbridas. Para tabelas padrão, você é responsável pela aplicação dessas restrições aos dados.

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

The following examples demonstrate cases in which Snowflake eliminates joins and references to tables that are not necessary:

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;

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.