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 que sales seja uma tabela com uma linha para cada venda de um produto. A tabela products contém menos linhas e é menor do que a tabela sales. Para encontrar todas as vendas de um produto específico, você junta a tabela sales (a tabela maior) com a tabela products (a tabela menor). Como a tabela products é 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 e sales 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 tabela sales (o lado da maior tabela) com a tabela customers (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;
Copy

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

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

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

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.