Como acelerar as consultas de junção com otimização de pesquisa¶
O serviço de otimização de pesquisa pode melhorar o desempenho das consultas de junção que têm um pequeno número de valores distintos no lado da menor tabela da junção.
Por exemplo, o serviço de otimização de pesquisa pode melhorar o desempenho desses tipos de junções:
Suponha que
products
seja uma tabela com uma linha para cada produto e quesales
seja uma tabela com uma linha para cada venda de um produto. A tabelaproducts
contém menos linhas e é menor do que a tabelasales
. Para encontrar todas as vendas de um produto específico, você junta a tabelasales
(a tabela maior) com a tabelaproducts
(a tabela menor). Como a tabelaproducts
é pequena, há poucos valores distintos no lado da menor tabela da junção.Nota
No armazenamento de dados, a tabela grande é frequentemente chamada de tabela de fatos (fact table). A tabela pequena é chamada de tabela de dimensões (dimension table). O restante deste tópico usa esses termos ao se referir à tabela grande e à tabela pequena em uma junção.
Suponha que
customers
seja uma tabela com uma linha para cada cliente esales
seja uma tabela com uma linha para cada venda. Ambas as tabelas são grandes. Para encontrar todas as vendas de um cliente específico, você une a tabelasales
(o lado da maior tabela) com a tabelacustomers
(o lado da menor tabela) e usa um filtro para que haja um pequeno número de valores distintos no lado da menor tabela da junção.
Neste tópico:
Habilitação do serviço de otimização de pesquisa para melhorar o desempenho de junções¶
Para permitir que o serviço de otimização de pesquisa melhore o desempenho das junções, adicione a otimização de pesquisa à tabela no lado da maior tabela da junção. Essa tabela geralmente é uma tabela grande que não é filtrada em consultas de junção, como uma tabela de fatos.
Para aproveitar a otimização de pesquisa, certifique-se de que o lado da menor tabela da junção tenha um pequeno número de valores distintos, seja por ser uma tabela de dimensão pequena ou por causa de um filtro seletivo. Os custos de otimização de pesquisa de uma consulta são proporcionais ao número de valores distintos que devem ser pesquisados no lado da menor tabela da junção. Se esse número for muito grande, o Snowflake pode decidir não usar o caminho de acesso de pesquisa e, em vez disso, usar o caminho de acesso à tabela regular.
Predicados de junção compatíveis¶
O serviço de otimização de pesquisa pode melhorar o desempenho das consultas com os seguintes tipos de predicados de junção:
Predicados de igualdade da forma
probe_side_table.column = build_side_table.column
.Transformações no operando do lado da menor tabela do predicado (por exemplo, concatenação de cadeia de caracteres, adição e assim por diante).
Conjunções (
AND
) de múltiplos predicados de igualdade.
Exemplos de consultas compatíveis¶
Esta seção mostra exemplos de consultas de junção que podem se beneficiar da otimização de pesquisa.
Exemplo: predicado de igualdade simples¶
A seguir, um exemplo de uma consulta compatível que utiliza um simples predicado de igualdade como o predicado de junção. Essa consulta une uma tabela nomeada sales
com uma tabela nomeada customers
. A tabela do lado da maior tabela sales
é grande e tem a otimização de pesquisa ativada. O lado da menor tabela customers
também é grande, mas a entrada dessa tabela é pequena, devido ao filtro seletivo na coluna customer_id
.
SELECT sales.date, customer.name
FROM sales JOIN customers ON (sales.customer_id = customers.customer_id)
WHERE customers.customer_id = 2094;
Exemplo: predicado transformado no operando do lado da dimensão¶
A consulta a seguir une uma tabela de fatos nomeada sales
com uma tabela de dimensões nomeada products
. A tabela de fatos é grande e tem a otimização de pesquisa habilitada. A tabela de dimensões é pequena.
Essa consulta transforma o operando do lado da dimensão do predicado (por exemplo, multiplicando valores na condição de junção) e pode se beneficiar da otimização de pesquisa:
SELECT sales.date, product.name
FROM sales JOIN products ON (sales.product_id = product.old_id * 100)
WHERE product.category = 'Cutlery';
Exemplo: predicado que abrange várias colunas¶
As consultas nas quais um predicado de junção abrange várias colunas podem se beneficiar da otimização de pesquisa:
SELECT sales.date, product.name
FROM sales JOIN products ON (sales.product_id = product.id and sales.location = product.place_of_production)
WHERE product.category = 'Cutlery';
Exemplo: consulta usando filtros de pesquisa pontual e predicados de junção¶
Em uma consulta que utiliza tanto filtros de pesquisa pontual regular e predicados de junção, o serviço de otimização de pesquisa pode melhorar o desempenho de ambos. Na consulta a seguir, o serviço de otimização de pesquisa pode aprimorar tanto o predicado de pesquisa pontual sales.location
quanto o predicado de junção product_id
:
SELECT sales.date, product.name
FROM sales JOIN products ON (sales.product_id = product.id)
WHERE product.category = 'Cutlery'
AND sales.location = 'Buenos Aires';
Limitações¶
As seguintes limitações se aplicam ao serviço de otimização de pesquisa e às consultas de junção:
Atualmente, não há suporte para disjuntos (
OR
) em predicados de junção.LIKE, ILIKE e RLIKE não são compatíveis com predicados de junção.
Atualmente, não há suporte para predicados de junção nas colunas VARIANT.
Atualmente não há suporte para predicados de igualdade EQUAL_NULL.
As limitações atuais do serviço de otimização de pesquisa também se aplicam às consultas de junção.