Poda top-K para aprimoramento de desempenho da consulta

Se uma instrução SELECT contiver as cláusulas LIMIT e ORDER BY, o Snowflake normalmente fará a varredura de todas as linhas elegíveis porque qualquer linha pode fazer parte dos K principais resultados, onde K é o valor da cláusula LIMIT. Com a poda top-K, o Snowflake interrompe a varredura quando determina que nenhuma das linhas restantes pode estar em um conjunto de resultados que consiste em K registros.

A poda top-K pode melhorar o desempenho das instruções SELECT que contêm cláusulas LIMIT e ORDER BY. As consultas em tabelas grandes são as que mais se beneficiam da poda top-K.

Consultas que usam a poda top-K

O Snowflake aplica a poda top-K somente quando todos os itens a seguir são verdadeiros:

  • A consulta contém uma cláusula ORDER BY e uma cláusula LIMIT.

  • A primeira coluna especificada na cláusula ORDER BY tem um dos seguintes tipos de dados:

    Se várias colunas forem especificadas, o Snowflake considerará apenas a primeira coluna.

  • Quando a consulta contém uma junção, a coluna ORDER BY é uma coluna da maior tabela. No armazenamento de dados, a tabela maior é geralmente chamada de tabela de fatos ou lado da maior tabela. A tabela menor é chamada de tabela de dimensão.

As consultas com cláusulas LIMIT que já são rápidas (como consultas em que uma varredura completa da tabela é rápida) podem não se beneficiar da poda top-K. As consultas que retornam menos de K linhas também não se beneficiam.

As consultas que contêm ORDER BY … DESCENDING em um campo anulável são eliminadas somente se também especificarem NULLS LAST.

Consultas em colunas VARIANT

Esta seção fornece exemplos de consultas em um campo de uma coluna VARIANT para mostrar os tipos de consultas que podem usar a poda top-K.

Crie uma tabela com uma coluna VARIANT e insira dados:

CREATE OR REPLACE TABLE variant_topk_test (var_col VARIANT);

INSERT INTO variant_topk_test
  SELECT PARSE_JSON(column1)
    FROM VALUES
      ('{"s": "aa", "i": 1}'),
      ('{"s": "bb", "i": 2}'),
      ('{"s": "cc", "i": 3}'),
      ('{"s": "dd", "i": 4}'),
      ('{"s": "ee", "i": 5}'),
      ('{"s": "ff", "i": 6}'),
      ('{"s": "gg", "i": 7}'),
      ('{"s": "hh", "i": 8}'),
      ('{"s": "ii", "i": 9}'),
      ('{"s": "jj", "i": 10}');
Copy

Essa tabela é relativamente pequena para servir de exemplo, mas lembre-se de que a poda top-K beneficia tabelas maiores.

As seguintes consultas nessa tabela podem usar a poda top-K:

SELECT * FROM variant_topk_test ORDER BY TO_VARCHAR(var_col:s) LIMIT 5;
Copy
SELECT * FROM variant_topk_test ORDER BY var_col:s::VARCHAR LIMIT 5;
Copy
SELECT * FROM variant_topk_test ORDER BY TO_NUMBER(var_col:i) LIMIT 5;
Copy
SELECT * FROM variant_topk_test ORDER BY var_col:i::NUMBER LIMIT 5;
Copy

A consulta a seguir não pode usar a poda top-K porque o valor não é convertido para o tipo de dados subjacente:

SELECT * FROM variant_topk_test ORDER BY var_col:s LIMIT 5;
Copy

A consulta a seguir não pode usar a poda top-K porque o valor é convertido em um tipo de dados diferente do tipo de dados subjacente:

SELECT * FROM variant_topk_test ORDER BY var_col:i::VARCHAR LIMIT 5;
Copy

Consultas que contêm uma função de agregação

As consultas que contêm uma função agregada são eliminadas somente se atenderem a todas as condições a seguir:

  • Elas incluem uma cláusula GROUP BY.

  • A primeira coluna ORDER BY também é uma coluna GROUP BY.

Por exemplo, a consulta a seguir pode usar a poda top-K porque a primeira coluna ORDER BY c2 também é uma coluna GROUP BY e não é uma coluna agregada:

SELECT c1, c2, c3, COUNT(*) AS agg_col
  FROM mytable
  GROUP BY c1, c2, c3
  ORDER BY c2, c1, agg_col, c3
  LIMIT 5;
Copy

A consulta a seguir não pode usar a poda top-K porque a primeira coluna ORDER BY agg_col é uma coluna agregada:

SELECT c1, c2, c3, COUNT(*) AS agg_col
  FROM mytable
  GROUP BY c1, c2, c3
  ORDER BY agg_col, c2, c1
  LIMIT 5;
Copy