Élagage des K premiers résultats pour améliorer la performance des requêtes

Si une instruction SELECT contient des clauses LIMIT et ORDER BY, Snowflake analyse normalement toutes les lignes éligibles, car n’importe quelle ligne peut faire partie des K premiers résultats, où K est la valeur de la clause LIMIT. Avec l’élagage des K premiers résultats, Snowflake arrête l’analyse lorsqu’il détermine qu’aucune des lignes restantes ne peut figurer dans un jeu de résultats composé de K enregistrements.

L’élagage des K premiers résultats peut améliorer les performances des instructions SELECT qui contiennent des clauses LIMIT et ORDER BY. Les requêtes portant sur de larges tables sont celles qui bénéficient le plus de l’élagage des K premiers résultats.

Requêtes utilisant l’élagage des K premiers résultats

Snowflake n’applique l’élagage des K premiers résultats que lorsque toutes les conditions suivantes sont réunies :

  • La requête contient une clause ORDER BY et une clause LIMIT.

  • La première colonne spécifiée dans la clause ORDER BY possède l’un des types de données suivants :

    • Un type de données représentable par un entier (c’est-à-dire un type INTEGER, un type DATE ou un type TIMESTAMP). Les expressions renvoyant des entiers, telles que des conversions de type, ne sont pas prises en charge.

    • Une chaîne ou un type de données binaires, y compris les chaînes classées.

    • Champ d’une colonne VARIANT dont le type sous-jacent est pris en charge (c’est-à-dire un type figurant dans les deux listes à puces précédentes) et qui est converti en ce type sous-jacent.

    Si plusieurs colonnes sont spécifiées, Snowflake ne prend en compte que la première colonne.

  • Lorsque la requête contient une jointure, la colonne ORDER BY est une colonne de la table la plus grande. Dans l’entrepôt de données, la table la plus grande est souvent désignée sous le nom de fact table ou côté sonde. La table la plus petite est appelée table de dimension.

Les requêtes comportant des clauses LIMIT qui sont déjà rapides (telles que les requêtes dans lesquelles un balayage complet de la table est rapide) peuvent ne pas bénéficier de l’élagage des K premiers résultats. Les requêtes qui renvoient moins de K lignes n’en bénéficient pas non plus.

Les requêtes qui contiennent ORDER BY. .. DESCENDING sur un champ annulable ne sont élaguées que si elles spécifient également NULLS LAST.

Requêtes sur les colonnes VARIANT

Cette section présente des exemples de requêtes sur un champ d’une colonne VARIANT pour montrer les types de requêtes qui peuvent utiliser l’élagage des K premiers résultats.

Créez une table avec une colonne VARIANT et insérez des données :

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

Cette table est relativement petite pour fournir un exemple, mais rappelez-vous que l’élagage des K premiers résultats profite aux tables plus grandes.

Les requêtes suivantes sur cette table peuvent utiliser l’élagage des K premiers résultats :

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

La requête suivante ne peut pas utiliser l’élagage des K premiers résultats car la valeur n’est pas convertie dans le type de données sous-jacent :

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

La requête suivante ne peut pas utiliser l’élagage des K premiers résultats car la valeur est convertie en un type de données différent du type de données sous-jacent :

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

Requêtes qui contiennent une fonction d’agrégation

Les requêtes qui contiennent une fonction d’agrégation ne sont élaguées que si elles remplissent toutes les conditions suivantes :

  • Elles comprennent une clause GROUP BY.

  • La première colonne ORDER BY est également une colonne GROUP BY.

Par exemple, la requête suivante peut utiliser l’élagage des K premiers résultats parce que la première colonne ORDER BY c2 est aussi une colonne GROUP BY et n’est pas une colonne agrégée :

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

La requête suivante ne peut pas utiliser l’élagage des K premiers résultats parce que la première colonne ORDER BY agg_col est une colonne agrégée :

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