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 quesales
soit une table contenant une ligne pour chaque vente d’un produit. La tableproducts
contient moins de lignes et est plus petite que la tablesales
. Pour trouver toutes les ventes d’un produit spécifique, vous joignez la tablesales
(la plus grande table) à la tableproducts
(la plus petite table). Comme la tableproducts
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 quesales
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 tablesales
(côté sonde) à la tablecustomers
(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;
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';
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';
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';
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.