Suche…


JOIN Hinweise

Wenn Sie zwei Tabellen verbinden, kann der SQL Server-Abfrageoptimierer (QO) verschiedene Arten von Joins auswählen, die in der Abfrage verwendet werden:

  • HASH beitreten
  • LOOP beitreten
  • MERGE beitreten

QO untersucht Pläne und wählt den optimalen Operator für das Verbinden von Tabellen aus. Wenn Sie jedoch sicher sind, dass Sie den optimalen Join-Operator kennen, können Sie angeben, welche Art von JOIN verwendet werden soll. Innerer LOOP-Join zwingt QO zur Auswahl des Nested-Loop-Joins, während er zwei Tabellen verbindet:

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

Inner Merge Join erzwingt den MERGE Join-Operator:

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

inneres Hash-Join zwingt den HASH-Join-Operator:

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

GROUP BY Hinweise

Wenn Sie die GROUP BY-Klausel verwenden, kann der SQL Server-Abfrageoptimierer (QO) verschiedene Typen von Gruppierungsoperatoren auswählen:

  • HASH Aggregat, das eine Hash-Map zum Gruppieren von Einträgen erstellt
  • Stream Aggregate, das gut mit vorbestellten Eingaben funktioniert

Sie können explizit verlangen, dass QO den einen oder anderen Aggregatoperator auswählt, wenn Sie wissen, was optimal ist. Mit OPTION (ORDER GROUP) wählt QO immer Stream-Aggregat und fügt den Sortieroperator vor Stream-Aggregat hinzu, wenn die Eingabe nicht sortiert ist:

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

Bei OPTION (HASH GROUP) wählt QO immer das Hash-Aggregat:

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

SCHNELLE Zeilen Hinweis

Gibt an, dass die Abfrage für das schnelle Abrufen der ersten number_rows optimiert ist. Dies ist eine nicht negative Ganzzahl. Nachdem die ersten number_rows zurückgegeben wurden, setzt die Abfrage die Ausführung fort und erzeugt die vollständige Ergebnismenge.

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

UNION Hinweise

Wenn Sie den UNION-Operator für zwei Abfrageergebnisse verwenden, kann der Abfrageoptimierer (QO) die folgenden Operatoren verwenden, um eine Vereinigung von zwei Ergebnissätzen zu erstellen:

  • Zusammenführen (Union)
  • Concat (Union)
  • Hash Match (Union)

Sie können explizit angeben, welcher Operator mit dem OPTION () - Hinweis verwendet werden soll:

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)

MAXDOP-Option

Gibt den maximalen Parallelitätsgrad für die Abfrage an, die diese Option angibt.

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

Diese Option überschreibt die MAXDOP-Konfigurationsoption von sp_configure und Resource Governor. Wenn MAXDOP auf Null gesetzt ist, wählt der Server den maximalen Parallelitätsgrad.

INDEX-Hinweise

Indexhinweise werden verwendet, um zu erzwingen, dass eine Abfrage einen bestimmten Index verwendet, anstatt zuzulassen, dass der Abfrageoptimierer von SQL Server den besten Index auswählt. In einigen Fällen können Sie Vorteile haben, indem Sie den Index angeben, den eine Abfrage verwenden muss. Normalerweise wählt der Abfrageoptimierer von SQL Server den besten für die Abfrage geeigneten Index aus. Aufgrund fehlender / veralteter Statistiken oder bestimmter Anforderungen können Sie dies erzwingen.

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow