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:
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_idda 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:
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:
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:
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.