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 Fabric
SQL 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
, HASH
ou 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 jointureINNER
ouLEFT
, 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 jointureRIGHT
, 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 jointureFULL
, 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 DimProduct
et 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