Microsoft SQL Server
Query-tips
Zoeken…
DOE MEE MET Hints
Wanneer u twee tabellen samenvoegt, kan SQL Server Query Optimizer (QO) verschillende typen joins kiezen die in de query worden gebruikt:
- HASH doe mee
- LOOP doe mee
- MERGE sluit zich aan
QO zal plannen verkennen en de optimale operator kiezen om aan tafels deel te nemen. Als u er echter zeker van bent dat u weet wat de optimale join-operator is, kunt u opgeven welk soort JOIN moet worden gebruikt. Inner LOOP-join dwingt QO om geneste lus-join te kiezen terwijl hij aan twee tafels meedoet:
select top 100 *
from Sales.Orders o
inner loop join Sales.OrderLines ol
on o.OrderID = ol.OrderID
inner merge join zal de MERGE join-operator forceren:
select top 100 *
from Sales.Orders o
inner merge join Sales.OrderLines ol
on o.OrderID = ol.OrderID
inner hash join zal HASH join operator forceren:
select top 100 *
from Sales.Orders o
inner hash join Sales.OrderLines ol
on o.OrderID = ol.OrderID
GROEP OP Hints
Wanneer u de GROUP BY-component gebruikt, kan SQL Server Query Optimizer (QO) verschillende typen groeperingsoperators kiezen:
- HASH Aggregate dat hash-map maakt voor het groeperen van items
- Stream Aggregate die goed werkt met vooraf bestelde ingangen
U kunt expliciet eisen dat QO een of andere aggregaatoperator kiest als u weet wat de optimale oplossing is. Met OPTIE (BESTELGROEP) kiest QO altijd Stream-aggregaat en voegt Sort operator voor Stream-aggregaat toe als invoer niet is gesorteerd:
select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (ORDER GROUP)
Met OPTIE (HASH GROUP) kiest QO altijd voor Hash-aggregaat:
select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (HASH GROUP)
SNELLE rijenhint
Geeft aan dat de query is geoptimaliseerd voor het snel ophalen van de eerste aantal rijen. Dit is een niet-negatief geheel getal. Nadat de eerste aantal rijen zijn geretourneerd, wordt de query voortgezet en wordt de volledige resultaatset geproduceerd.
select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (FAST 20)
UNION hints
Wanneer u de UNION-operator gebruikt voor twee queryresultaten, kan Query Optimizer (QO) de volgende operators gebruiken om een unie van twee resultatensets te maken:
- Samenvoegen (Union)
- Concat (Unie)
- Hash Match (Union)
U kunt expliciet opgeven welke operator moet worden gebruikt met de OPTION () -hint:
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-optie
Hiermee geeft u de maximale mate van parallelliteit op voor de query die deze optie opgeeft.
SELECT OrderID,
AVG(Quantity)
FROM Sales.OrderLines
GROUP BY OrderID
OPTION (MAXDOP 2);
Deze optie overschrijft de MAXDOP-configuratieoptie van sp_configure en Resource Governor. Als MAXDOP op nul is ingesteld, kiest de server de maximale mate van parallelliteit.
INDEX Tips
Indexhints worden gebruikt om een query te dwingen een specifieke index te gebruiken, in plaats van dat Query Optimizer van SQL Server kan kiezen wat volgens hem de beste index is. In sommige gevallen kunt u voordelen behalen door de index op te geven die een zoekopdracht moet gebruiken. Meestal kiest Query Optimizer van SQL Server de beste index die geschikt is voor de query, maar vanwege ontbrekende / verouderde statistieken of specifieke behoeften kunt u deze forceren.
SELECT *
FROM mytable WITH (INDEX (ix_date))
WHERE field1 > 0
AND CreationDate > '20170101'