Microsoft SQL Server
Conseils de requête
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'