Recherche…


JOIN Hints

Lorsque vous joignez deux tables, l'optimiseur de requêtes SQL (QO) peut choisir différents types de jointures à utiliser dans la requête:

  • HASH rejoindre
  • LOOP rejoindre
  • Joindre

QO explorera les plans et choisira l'opérateur optimal pour joindre les tables. Toutefois, si vous êtes certain de connaître l’opérateur de jointure optimal, vous pouvez spécifier le type de jointure à utiliser. La jointure LOOP interne obligera QO à choisir une jointure de boucle imbriquée en joignant deux tables:

select top 100 *
from Sales.Orders o 
    inner loop join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

jointure de fusion interne forcera l'opérateur de jointure MERGE:

select top 100 *
from Sales.Orders o 
    inner merge join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

jointure de hachage interne forcera l'opérateur de jointure HASH:

select top 100 *
from Sales.Orders o 
    inner hash join Sales.OrderLines ol 
    on o.OrderID = ol.OrderID

Astuces GROUP BY

Lorsque vous utilisez la clause GROUP BY, l'optimiseur de requête SQL (QO) peut choisir différents types d'opérateurs de regroupement:

  • HASH Aggregate qui crée une carte de hachage pour le regroupement des entrées
  • Stream Aggregate qui fonctionne bien avec les entrées pré-commandées

Vous pouvez explicitement exiger que QO choisisse un opérateur ou un autre opérateur agrégé si vous savez ce qui serait optimal. Avec OPTION (ORDER GROUP), QO choisira toujours l'agrégat de flux et ajoutera l'opérateur de tri devant l'agrégat de flux si l'entrée n'est pas triée:

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (ORDER GROUP) 

Avec OPTION (HASH GROUP), QO choisira toujours l'agrégat Hash:

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (HASH GROUP) 

Lignes FAST

Indique que la requête est optimisée pour une récupération rapide du premier nombre_rows. Ceci est un entier non négatif. Une fois que les premières Number_rows sont renvoyées, la requête continue son exécution et produit son jeu de résultats complet.

select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (FAST 20) 

Conseils UNION

Lorsque vous utilisez l'opérateur UNION sur deux résultats de requête, l'optimiseur de requêtes (QO) peut utiliser les opérateurs suivants pour créer une union de deux jeux de résultats:

  • Fusionner (union)
  • Concat (Union)
  • Match de hachage (union)

Vous pouvez explicitement spécifier quel opérateur doit être utilisé avec l’option OPTION ():

select OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Sales.Orders
where OrderDate > DATEADD(day, -1, getdate())
UNION
select PurchaseOrderID as OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Purchasing.PurchaseOrders
where OrderDate > DATEADD(day, -1, getdate())
OPTION(HASH UNION)
-- or OPTION(CONCAT UNION)
-- or OPTION(MERGE UNION)

Option MAXDOP

Spécifie le degré de parallélisme maximal pour la requête spécifiant cette option.

SELECT OrderID,
    AVG(Quantity)
FROM Sales.OrderLines
GROUP BY OrderID
OPTION (MAXDOP 2);

Cette option remplace l'option de configuration MAXDOP de sp_configure et du gouverneur de ressources. Si MAXDOP est défini sur zéro, le serveur choisit le degré de parallélisme maximal.

INDEX Conseils

Les indicateurs d'index sont utilisés pour forcer une requête à utiliser un index spécifique, au lieu d'autoriser Query Optimizer de SQL Server à choisir ce qu'il considère comme le meilleur index. Dans certains cas, vous pouvez obtenir des avantages en spécifiant l'index qu'une requête doit utiliser. Généralement, Query Optimizer de SQL Server choisit le meilleur index adapté à la requête, mais en raison de statistiques manquantes / obsolètes ou de besoins spécifiques, vous pouvez le forcer.

SELECT *
FROM mytable WITH (INDEX (ix_date))
WHERE field1 > 0
    AND CreationDate > '20170101'


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow