Sök…


GÅ MED Hints

När du går med i två tabeller kan SQL Server query optimizer (QO) välja olika typer av sammanfogningar som kommer att användas i frågan:

  • HASH gå med
  • LOOP gå med
  • MERGE gå med

QO kommer att utforska planer och välja den optimala operatören för att gå med i tabeller. Men om du är säker på att du vet vad som skulle vara den bästa anslutningsoperatören kan du ange vilken typ av JOIN som ska användas. Inre LOOP-anslutning kommer att tvinga QO att välja Nested loop-anslutning medan du går i två tabeller:

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

inre sammanslagning kommer att tvinga MERGE gå med operatör:

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

inner hash join kommer att tvinga HASH gå med operatör:

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

GRUPPER AV Tips

När du använder GROUP BY-klausulen kan SQL Server query Optimizer (QO) välja olika typer av gruppoperatörer:

  • HASH Aggregat som skapar hash-karta för gruppering av poster
  • Stream Aggregate som fungerar bra med förbeställda ingångar

Du kan uttryckligen kräva att QO väljer en eller annan aggregatoperatör om du vet vad som skulle vara det bästa. Med OPTION (ORDER GROUP) kommer QO alltid att välja Stream aggregat och lägga till sorteringsoperatör framför Stream aggregat om ingången inte sorteras:

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

Med OPTION (HASH GROUP) kommer QO alltid att välja Hash-aggregat:

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

FAST rader ledtråd

Anger att frågan är optimerad för snabb återhämtning av de första numrerade ringarna. Detta är ett icke-negativt heltal. Efter att de första numren har återlämnats fortsätter frågan att köras och producerar dess fulla resultatuppsättning.

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

UNION tips

När du använder UNION-operatören i två frågeställningar kan Query Optimizer (QO) använda följande operatörer för att skapa en sammanslutning av två resultatsatser:

  • Slå samman (Union)
  • Concat (Union)
  • Hash Match (Union)

Du kan uttryckligen ange vilken operatör som ska användas med antingen 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)

MAXDOP-alternativ

Anger den maximala graden av parallellitet för frågan som anger detta alternativ.

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

Det här alternativet åsidosätter konfigurationsalternativet för MAXDOP för sp_configure och Resource Governor. Om MAXDOP är inställt på noll väljer servern den maximala graden av parallellitet.

INDEX-tips

Indextips används för att tvinga en fråga att använda ett specifikt index istället för att låta SQL Server's Query Optimizer välja vad den anser vara det bästa indexet. I vissa fall kan du få fördelar genom att ange det index som en fråga måste använda. Vanligtvis väljer SQL Server's Query Optimizer det bästa indexet som passar frågan, men på grund av saknad / föråldrad statistik eller specifika behov kan du tvinga den.

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow