Accélérer les requêtes de jointure grâce à l’optimisation de la recherche

Le service d’optimisation de la recherche peut améliorer les performances des requêtes de jointure qui comportent un petit nombre de valeurs distinctes du côté de la construction de la jointure.

Par exemple, le service d’optimisation de la recherche peut améliorer les performances de ce type de jointures :

  • Supposons que products soit une table contenant une ligne pour chaque produit et que sales soit une table contenant une ligne pour chaque vente d’un produit. La table products contient moins de lignes et est plus petite que la table sales. Pour trouver toutes les ventes d’un produit spécifique, vous joignez la table sales (la plus grande table) à la table products (la plus petite table). Comme la table products est petite, il y a peu de valeurs distinctes du côté de la construction de la jointure.

    Note

    Dans l’entreposage de données, la grande table est souvent appelée la table des faits. La petite table est appelée la table dimensionnelle. Dans la suite de cette rubrique, ces termes sont utilisés pour désigner la grande table et la petite table dans une jointure.

  • Supposons que customers soit une table contenant une ligne pour chaque client et que sales soit une table contenant une ligne pour chaque vente. Les deux tables sont grandes. Pour trouver toutes les ventes d’un client spécifique, vous joignez la table sales (côté sonde) à la table customers (côté construction) et utilisez un filtre pour qu’il y ait un petit nombre de valeurs distinctes du côté construction de la jointure.

Dans ce chapitre :

Permettre au service d’optimisation de la recherche d’améliorer les performances des jointures

Pour permettre au service d’optimisation de la recherche d’améliorer les performances des jointures, ajoute l’optimisation de la recherche à la table du côté de la sonde de la jointure. Cette table est généralement une grande table qui n’est pas filtrée dans les requêtes de jointure, telle qu’une table de faits.

Pour tirer parti de l’optimisation de la recherche, assurez-vous que le côté construction de la jointure comporte un petit nombre de valeurs distinctes, soit parce qu’il s’agit d’une table de dimension réduite, soit en raison d’un filtre sélectif. Les coûts d’optimisation de la recherche d’une requête sont proportionnels au nombre de valeurs distinctes qui doivent être recherchées du côté de la construction de la jointure. Si ce nombre est trop élevé, Snowflake peut décider de ne pas utiliser le chemin d’accès à la recherche et d’utiliser plutôt le chemin d’accès à la table ordinaire.

Prédicats de jointure pris en charge

Le service d’optimisation de la recherche peut améliorer les performances des requêtes avec les types de prédicats de jointure suivants :

  • Prédicats d’égalité de la forme probe_side_table.column = build_side_table.column.

  • Transformations sur l’opérande côté construction du prédicat (par exemple, concaténation de chaînes, addition, etc.).

  • Conjonctions (AND) de prédicats d’égalité multiples.

Exemples de requêtes prises en charge

Cette section présente des exemples de requêtes de jointure qui peuvent bénéficier d’une optimisation de la recherche.

Exemple : Prédicat d’égalité simple

Voici un exemple de requête prise en charge qui utilise un prédicat d’égalité simple comme prédicat de jointure. Cette requête joint une table nommée sales à une table nommée customers. La table côté sonde sales est de grande taille et l’optimisation de la recherche est activée. La table côté construction customers est également grande, mais l’entrée de cette table est petite, en raison du filtre sélectif sur la colonne customer_id.

SELECT sales.date, customer.name
  FROM sales JOIN customers ON (sales.customer_id = customers.customer_id)
  WHERE customers.customer_id = 2094;
Copy

Exemple : Prédicat transformé sur l’opérande côté dimension

La requête suivante associe une table de faits nommée sales à une table de dimensions nommée products. La table des faits est volumineuse et l’optimisation de la recherche est activée. La table de dimensions est petite.

Cette requête transforme l’opérande côté dimension du prédicat (par exemple, en multipliant les valeurs dans la condition de jointure) et peut bénéficier d’une optimisation de la recherche :

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.old_id * 100)
  WHERE product.category = 'Cutlery';
Copy

Exemple : Prédicat couvrant plusieurs colonnes

Les requêtes dans lesquelles un prédicat de jointure s’étend sur plusieurs colonnes peuvent bénéficier d’une optimisation de la recherche :

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

Exemple : Requête utilisant des filtres ponctuels et des prédicats de jointure

Dans une requête qui utilise à la fois des filtres ponctuels classiques et des prédicats de jointure, le service d’optimisation de la recherche peut améliorer les performances des deux. Dans la requête suivante, le service d’optimisation de la recherche peut améliorer le prédicat de recherche de points sales.location ainsi que le prédicat de jointure 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

Limitations

Les limites suivantes s’appliquent au service d’optimisation de la recherche et aux requêtes de jointure :

  • Les disjonctions (OR) dans les prédicats de jointure ne sont actuellement pas pris en charge.

  • Les prédicats de jointure LIKE, ILIKE et RLIKE ne sont actuellement pas pris en charge.

  • Les prédicats de jointure sur les colonnes VARIANT ne sont actuellement pas pris en charge.

  • Les prédicats d’égalité EQUAL_NULL ne sont actuellement pas pris en charge.

  • Les limites actuelles du service d’optimisation de la recherche s’appliquent également aux requêtes de jointure.