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.

Les sections suivantes fournissent de plus amples informations sur la prise en charge de l’optimisation de la recherche pour les requêtes de jointure :

Activation de l’optimisation de la recherche pour les requêtes de jointure

Pour améliorer les performances des requêtes de jointure, assurez-vous que l’optimisation de la recherche est activée pour les colonnes dans le prédicat de jointure de la requête. De plus 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’exécution de l’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.

Pour améliorer les performances des requêtes de jointure, active l’optimisation de la recherche pour 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.

Utilisez la commande ALTER TABLE … ADD SEARCH OPTIMIZATION pour :

  • Activer l’optimisation de la recherche pour des colonnes spécifiques.

  • Activer l’optimisation de la recherche pour toutes les colonnes de la table.

En général, la meilleure pratique consiste à n’activer l’optimisation de la recherche que pour des colonnes spécifiques. Utilisez la clause ON EQUALITY pour spécifier les colonnes. Cet exemple active l’optimisation de la recherche pour une colonne spécifique :

ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON EQUALITY(mycol);
Copy

Pour spécifier EQUALITY pour toutes les colonnes des types de données pris en charge (à l’exception de semi-structurées et GEOGRAPHY) :

ALTER TABLE mytable ADD SEARCH OPTIMIZATION;
Copy

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 de jointure 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.