Partage via


Indicateurs de jointure (Transact-SQL)

S’applique à :point de terminaison d’analytique SQL Azure SQL Database Azure SQL Database Azure SQL Dans Microsoft Fabric Warehouse dans Microsoft FabricSQL Database dans Microsoft FabricSQL Database

Les indicateurs de jointure spécifient l'application, par l'optimiseur de requête, d'une stratégie de jointure entre deux tables dans SQL Server. Pour obtenir des informations générales sur les jointures et la syntaxe de jointure, consultez la clause FROM ainsi que JOIN, APPLY, PIVOT.

Attention

Étant donné que l'optimiseur de requête SQL Server sélectionne généralement le meilleur plan d'exécution pour une requête, nous vous recommandons de ne recourir à ces conseils qu'en dernier ressort et seulement si vous êtes un développeur ou un administrateur de base de données expérimenté.

S’applique à

Conventions de la syntaxe Transact-SQL

Syntaxe

<join_hint> ::=
     { LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}

Arguments

{ LOOP | HASH | MERGE }

s’applique à : Azure SQL Database, Azure SQL Managed Instance, point de terminaison d’analyse SQL, base de données SQL dans Microsoft Fabric, Microsoft Fabric Warehouse

Spécifie que la jointure dans la requête doit utiliser les boucles, le hachage ou la fusion. Utilisation LOOP, HASHou MERGE JOIN applique une jointure particulière entre deux tables. LOOP ne peut pas être spécifié avec RIGHT ou FULL en tant que type de jointure. Pour plus d’informations, consultez Jointures.

REMOTE

S’applique à : Azure SQL Database, Azure SQL Managed Instance, point de terminaison d’analyse SQL, base de données SQL dans Microsoft Fabric

Effectue une opération de jointure sur le site de la table de droite. Ceci est utile lorsque la table de gauche est une table locale et que celle de droite est une table distante. REMOTE ne doit être utilisé que lorsque la table de gauche comporte moins de lignes que la table de droite.

Si la table de droite est une table locale, la jointure sera effectuée en local. Si les deux tables sont distantes mais provenant de différentes sources de données, REMOTE la jointure est effectuée sur le site de la table appropriée. Si les deux tables sont des tables distantes à partir de la même source de données, REMOTE n’est pas nécessaire.

REMOTE ne peut pas être utilisé lorsque l’une des valeurs comparées dans le prédicat de jointure est convertie en un classement différent à l’aide de la COLLATE clause.

REMOTE ne peut être utilisé que pour INNER JOIN les opérations.

REDUCE

s’applique à : Azure Synapse Analytics and Analytics Platform System (PDW)

Réduit le nombre de lignes de la table à déplacer à droite de la jointure afin que les deux tables de distribution incompatibles deviennent compatibles. L’indicateur REDUCE est également appelé indicateur de semi-jointure.

REPLICATE

s’applique à : Azure Synapse Analytics, Analytics Platform System (PDW), Microsoft Fabric Warehouse

Provoque une opération de déplacement de diffusion, où une table spécifique doit être répliquée sur tous les nœuds de distribution.

  • À l’aide de REPLICATE avec une jointure INNER ou LEFT, l’opération de déplacement de diffusion réplique le côté droit de la jointure sur tous les nœuds.
  • De même, lors de l’utilisation de REPLICATE avec une jointure RIGHT, l’opération de déplacement de diffusion réplique le côté gauche de la jointure sur tous les nœuds.
  • Lorsque vous utilisez REPLICATE avec une jointure FULL, un plan estimé ne peut pas être créé.

REDISTRIBUTE [(columns_count)]

s’applique à : Azure Synapse Analytics and Analytics Platform System (PDW)

Force la distribution de deux sources de données sur les colonnes spécifiées dans la clause JOIN. Pour une table distribuée, Analytics Platform System (PDW) effectue un déplacement aléatoire sur la première colonne des deux tables Pour une table répliquée, Analytics Platform System (PDW) effectue un déplacement de découpage. Pour comprendre ces types de déplacements, consultez la section sur les opérations du plan de requête DMS dans l’article « Understanding Query Plans » de la documentation du produit Analytics Platform System (PDW). Cet indicateur peut améliorer les performances quand le plan de requête utilise un déplacement par diffusion pour résoudre un problème de jointure de distribution incompatible.

s’applique à : Microsoft Fabric Warehouse

L’indicateur REDISTRIBUTE garantit que deux sources de données sont distribuées en fonction des colonnes de clause JOIN. Il gère plusieurs conditions de jointure, spécifiées par les premières colonnes n dans les deux tables, où n est l’argument column_count. La redistribution des données optimise les performances des requêtes en répartissant uniformément les données entre les nœuds pendant les étapes intermédiaires de l’exécution.

L’argument (columns_count) n’est pris en charge que dans Microsoft Fabric Warehouse.

Notes

Les indicateurs de jointure sont spécifiés dans la FROM clause d’une requête. Les indicateurs de jointure appliquent une stratégie de jointure entre deux tables. Si un indicateur de jointure est spécifié pour deux tables, l’optimiseur de requête applique automatiquement l’ordre de jointure pour toutes les tables jointes de la requête, en fonction de la position des ON mots clés. Lorsqu’une CROSS JOIN clause est utilisée sans clause ON , les parenthèses peuvent être utilisées pour indiquer l’ordre de jointure.

Exemples

Les exemples de code de cet article utilisent l’exemple de base de données AdventureWorks2022 ou AdventureWorksDW2022, que vous pouvez télécharger à partir de la page d’accueil Microsoft SQL Server Samples and Community Projects.

R : Utiliser HASH

L'exemple suivant spécifie que l'opération JOIN figurant dans la requête est effectuée par une jointure HASH.

SELECT p.Name,
    pr.ProductReviewID
FROM Production.Product AS p
LEFT OUTER HASH JOIN Production.ProductReview AS pr
    ON p.ProductID = pr.ProductID
ORDER BY ProductReviewID DESC;

B. Utiliser LA BOUCLE

L'exemple suivant spécifie que l'opération JOIN figurant dans la requête est effectuée par une jointure LOOP.

DELETE
FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER LOOP JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

C. Utiliser MERGE

L'exemple suivant spécifie que l'opération JOIN figurant dans la requête est effectuée par une jointure MERGE.

SELECT poh.PurchaseOrderID,
    poh.OrderDate,
    pod.ProductID,
    pod.DueDate,
    poh.VendorID
FROM Purchasing.PurchaseOrderHeader AS poh
INNER MERGE JOIN Purchasing.PurchaseOrderDetail AS pod
    ON poh.PurchaseOrderID = pod.PurchaseOrderID;
GO

D. Exemple d’indicateur de jointure REDUCE

L’exemple suivant utilise l’indicateur de jointure REDUCE pour modifier le traitement de la table dérivée dans la requête. Quand vous utilisez l’indicateur de jointure REDUCE dans cette requête, la valeur fis.ProductKey est projetée, répliquée et rendue unique, puis jointe à DimProduct lors de la lecture aléatoire de DimProduct sur ProductKey. La table dérivée qui en résulte est distribuée sur fis.ProductKey.

-- Uses AdventureWorks
  
SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REDUCE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

E. Exemple d’indicateur de jointure REPLICATE

L’exemple suivant montre la même requête que l’exemple précédent, à ceci près qu’un indicateur de jointure REPLICATE est utilisé à la place de l’indicateur de jointure REDUCE. Quand vous utilisez l’indicateur REPLICATE, les valeurs dans la colonne (jointure) ProductKey de la table FactInternetSales sont répliquées vers tous les nœuds. La table DimProduct est jointe à la version répliquée de ces valeurs.

-- Uses AdventureWorks

SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REPLICATE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

F. Utilisation de l’indicateur REDISTRIBUTE pour garantir un déplacement aléatoire dans une jointure de distribution incompatible

La requête suivante utilise l’indicateur de requête REDISTRIBUTE sur une jointure incompatible de distribution. Cela garantit que l’optimiseur de requête utilise un déplacement aléatoire dans le plan de requête. Cela empêche également que le plan de requête utilise un déplacement par diffusion pour déplacer une table distribuée vers une table répliquée.

Dans l’exemple suivant, l’indicateur REDISTRIBUTE force un déplacement aléatoire sur la table FactInternetSales, car ProductKey est la colonne de distribution pour DimProductet n’est pas la colonne de distribution pour FactInternetSales.

-- Uses AdventureWorks
  
SELECT dp.ProductKey,
    fis.SalesOrderNumber,
    fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

G. Utiliser l’argument de nombre de colonnes avec l’indicateur REDISTRIBUTE

La requête suivante utilise l’indicateur de requête REDISTRIBUTE avec l’argument de nombre de colonnes, et le shuffle se déroule sur les quatre premières colonnes de chaque table de la jointure.

SELECT * FROM DA
INNER REDISTRIBUTE (4) JOIN DB
ON DA.a1 = DB.b1