Comprendre comment Snowflake peut éliminer les jointures redondantes

Dans certains cas, une jointure sur une colonne clé peut faire référence à des tables qui ne sont pas nécessaires pour la jointure. Si vos tables ont des colonnes clés et que vous utilisez et appliquez les contraintes UNIQUE, PRIMARY KEY et FOREIGN KEY, Snowflake peut améliorer les performances des requêtes en éliminant les jointures inutiles sur les colonnes clés.

Ces optimisations ne sont effectuées que si vous utilisez la propriété de contrainte RELY pour indiquer que les données de vos tables respectent les contraintes autour des clés primaires et des clés étrangères.

Dans ce chapitre :

Définition de la propriété de contrainte RELY pour éliminer les jointures inutiles

Snowflake n’effectue cette optimisation sur les jointures que si vous indiquez que les données de vos tables sont conformes aux contraintes UNIQUE, PRIMARY KEY et FOREIGN KEY.

Comme mentionné dans Types de contraintes pris en charge, Snowflake n’applique pas les contraintes UNIQUE, PRIMARY KEY et FOREIGN KEY. Vous êtes responsable de l’application de ces contraintes aux données de la table.

Si vous vous êtes assuré que les données respectent ces contraintes et que vous souhaitez que Snowflake élimine les jointures inutiles, définissez la propriété de contrainte RELY pour les contraintes UNIQUE, PRIMARY KEY, FOREIGN KEY.

Note

Vous êtes responsable du maintien de l’intégrité de vos contraintes (UNIQUE, PRIMARY KEY, et FOREIGN KEY). Si l’intégrité de vos contraintes n’est pas maintenue, les résultats de la requête peuvent différer si la propriété de la contrainte RELY est définie (par rapport aux résultats avec NORELY).

Exemples d’élimination de jointures inutiles

Les exemples suivants montrent des cas dans lesquels Snowflake élimine les jointures et les références aux tables qui ne sont pas nécessaires :

Dans ces exemples :

  • dim_products est un tableau qui contient une ligne pour chaque produit disponible à l’achat.

    Dans cette table, product_id est une colonne qui identifie de manière unique un produit.

  • fact_sales est un tableau qui contient une ligne pour chaque vente d’un produit.

    Dans ce tableau, product_id est une colonne qui identifie le produit qui a été vendu. Les IDs de cette colonne correspondent aux IDs de la colonne product_id de la table dim_products.

Exemple 1 : Élimination d’une jointure externe gauche inutile

Ce qui suit est un exemple d’une jointure externe gauche inutile que Snowflake peut optimiser :

SELECT f.*
FROM fact_sales f
LEFT OUTER JOIN dim_products p
ON f.product_id = p.product_id;

La jointure n’est pas nécessaire car l’instruction ne fait référence à aucune colonne de la table dim_products à droite (autre que la colonne clé primaire pour la jointure).

Si la colonne dim_products.product_id a la contrainte UNIQUE ou PRIMARY KEY avec la propriété RELY, Snowflake peut identifier cette jointure comme inutile et peut éliminer la référence à la table dim_products à droite.

Exemple 2 : Élimination d’une auto-jointure inutile

Ce qui suit est un exemple d’auto-jointure inutile que Snowflake peut optimiser :

SELECT p1.product_id, p2.product_name
FROM dim_products p1, dim_products p2
WHERE p1.product_id = p2.product_id;

L’instruction joint inutilement la table dim_products avec elle-même et sélectionne les colonnes de cette table.

Si la colonne dim_products.product_id a la contrainte UNIQUE ou PRIMARY KEY avec la propriété RELY, Snowflake peut identifier cette jointure comme inutile et peut éliminer la référence à la table dim_products à droite.

Exemple 3 : Élimination d’une jointure inutile sur une clé primaire et une clé étrangère

Ce qui suit est un exemple d’une jointure interne inutile que Snowflake peut optimiser.

SELECT p.product_id, f.units_sold
FROM   fact_sales f, dim_products p
WHERE  f.product_id = p.product_id;

L’instruction ne fait référence à aucune colonne de la table dim_products à droite, autre que la colonne de clé primaire pour la jointure.

Si la colonne dim_products.product_id a la contrainte PRIMARY KEY et la colonne fact_sales.product_id a la contrainte FOREIGN KEY, Snowflake peut identifier cette jointure comme inutile et peut éliminer la référence à la table dim_products sur la droite.

Revenir au début