Aller au contenu principal

Optimisation des requêtes à l'aide de la clé primaire et des contraintes uniques

Les clés primaires et les contraintes d'unicité, qui capturent les relations d'unicité entre les champs des tables, peuvent aider les utilisateurs et les outils à comprendre les relations dans vos données. Cet article contient des exemples qui montrent comment vous pouvez utiliser les clés primaires ou les contraintes d'unicité avec l'option RELY pour optimiser certains types de query courants.

remarque

Les optimisations de query associées à la commande RELY nécessitent l'exécution des queries sur un compute compatible Photon. Consultez Qu'est-ce que Photon ?. Photon s'exécute par default sur les SQL warehouses et le compute serverless pour les notebooks et les workflows. Pour en savoir plus sur Photon, consultez Qu'est-ce que Photon ?.

Ajouter une clé primaire ou des contraintes d’unicité

Vous pouvez ajouter une clé primaire ou une contrainte unique dans votre instruction de création de table, comme dans l'exemple suivant, ou en ajouter une à une table à l'aide de la clause ADD CONSTRAINT.

SQL
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
)

Dans cet exemple, c_customer_sk est la clé de l'ID client. La contrainte de clé primaire spécifie que chaque valeur d'ID client doit être unique dans la table. Les contraintes d'unicité suivent le même modèle en utilisant UNIQUE au lieu de PRIMARY KEY.

Databricks n'applique pas les contraintes de clé. Elles peuvent être validées via votre pipeline de données existant ou votre ETL. Consultez Gérer la qualité des données avec les attentes de pipeline pour en savoir plus sur les attentes en matière de tables de streaming et de vues matérialisées. Consultez les contraintes sur Databricks pour en savoir plus sur l'utilisation des contraintes sur les tables Delta.

remarque

Il incombe à l'utilisateur de vérifier si une contrainte est satisfaite. S'appuyer sur une contrainte qui n'est pas satisfaite peut entraîner des résultats de query incorrects.

Utilisez RELY pour activer les optimisations

Lorsque vous savez qu'une clé primaire ou une contrainte d'unicité est valide, vous pouvez activer les optimisations basées sur la contrainte en la spécifiant avec l'option RELY. Pour la syntaxe complète, consultez la clause ADD CONSTRAINT.

L'option RELY permet à Databricks d'exploiter la contrainte pour réécrire les queries. Les optimisations suivantes peuvent être effectuées uniquement si l'option RELY est spécifiée dans une clause ADD CONSTRAINT ou une instruction ALTER TABLE.

À l'aide de ALTER TABLE, vous pouvez modifier la clé primaire d'une table pour inclure l'option RELY, comme illustré dans l'exemple suivant.

SQL

ALTER TABLE
customer DROP PRIMARY KEY;
ALTER TABLE
customer
ADD
PRIMARY KEY (c_customer_sk) RELY;

Exemples d'optimisation

Les exemples suivants étendent l'exemple précédent qui crée une table customerc_customer_sk est un identifiant unique vérifié nommé PRIMARY KEY avec l'option RELY spécifiée. Les mêmes optimisations peuvent s'appliquer à une contrainte UNIQUE avec l'option RELY.

Exemple 1 : éliminer les agrégations inutiles

Ce qui suit montre une query qui applique une opération DISTINCT à une clé primaire.

SQL
SELECT
DISTINCT c_customer_sk
FROM
customer;

Étant donné que la colonne c_customer_sk est une contrainte PRIMARY KEY vérifiée, toutes les valeurs de la colonne sont uniques. Lorsque l'option RELY est spécifiée, Databricks peut optimiser la query en n'effectuant pas l'DISTINCT opération.

L'optimiseur peut également supprimer DISTINCT lorsque la colonne sélectionnée est couverte par une contrainte UNIQUE valide spécifiée avec RELY.

Exemple 2 : Éliminer les jointures inutiles

L'exemple suivant montre une query où Databricks peut éliminer une jointure inutile.

La query joint une table de faits, store_sales à une table de dimensions, customer. Elle effectue une jointure externe gauche, de sorte que le résultat de la query inclut tous les enregistrements de la table store_sales et les enregistrements correspondants de la table customer. S'il n'y a pas d'enregistrement correspondant dans la table customer, le résultat de la query affiche une valeur NULL pour la colonne c_customer_sk.

SQL
SELECT
SUM(ss_quantity)
FROM
store_sales ss
LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;

Pour comprendre pourquoi cette jointure est inutile, examinez l'instruction de query. Elle nécessite uniquement la colonne ss_quantity de la table store_sales. La table customer est jointe sur sa clé primaire ou sur une contrainte unique, de sorte que chaque ligne de store_sales corresponde à au plus une ligne de customer. Étant donné que l'opération est une jointure externe, tous les enregistrements de la table store_sales sont préservés, de sorte que la jointure ne modifie aucune donnée de cette table. L'agrégation SUM est la même que ces tables soient jointes ou non.

L'utilisation de la clé primaire ou d'une contrainte d'unicité avec RELY fournit à l'optimiseur de requêtes les informations dont il a besoin pour éliminer la jointure. La query optimisée ressemble davantage à ceci :

SQL
SELECT
SUM(ss_quantity)
FROM
store_sales ss

Étapes suivantes

Voir Afficher le diagramme d'entité-relation pour apprendre à explorer les relations entre clés primaires et clés étrangères dans l'interface utilisateur de Catalog Explorer.