Ricerca…


ISCRIVITI

Quando si uniscono due tabelle, Query Optimizer (QO) di SQL Server può scegliere diversi tipi di join che verranno utilizzati nella query:

  • HASH join
  • LOOP join
  • Unisciti a MERGE

QO esplorerà i piani e sceglierà l'operatore ottimale per unire le tabelle. Tuttavia, se sei sicuro di sapere quale sarebbe l'operatore di join ottimale, puoi specificare quale tipo di JOIN dovrebbe essere usato. Inner LOOP join costringerà QO a scegliere Nested loop join durante l'unione di due tabelle:

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

l'unione interna di unione forzerà l'operatore di join MERGE:

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

l'hash join interno costringerà l'operatore di HASH join:

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

GRUPPO PER CONSIGLI

Quando si utilizza la clausola GROUP BY, SQL Server Query Optimizer (QO) può scegliere diversi tipi di operatori di raggruppamento:

  • HASH Aggregate che crea hash-map per il raggruppamento delle voci
  • Stream Aggregate che funziona bene con gli input preordinati

È possibile richiedere esplicitamente che QO scelga uno o un altro operatore aggregato se si sa quale sarebbe l'ottimale. Con OPTION (ORDER GROUP), QO sceglierà sempre Stream aggregate e aggiungerà l'operatore Sort davanti a Stream aggregate se l'input non è ordinato:

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

Con OPTION (GRUPPO HASH), QO sceglierà sempre l'aggregato hash:

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

Suggerimento di righe VELOCI

Specifica che la query è ottimizzata per il recupero rapido dei primi number_rows. Questo è un numero intero non negativo. Dopo che sono stati restituiti i primi number_rows, la query continua l'esecuzione e produce il set di risultati completo.

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

UNION suggerisce

Quando si utilizza l'operatore UNION su due risultati di query, Query Optimizer (QO) può utilizzare gli operatori seguenti per creare un'unione di due set di risultati:

  • Unione (unione)
  • Concat (Union)
  • Hash Match (Union)

È possibile specificare esplicitamente quale operatore deve essere utilizzato utilizzando il suggerimento 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)

Opzione MAXDOP

Specifica il grado massimo di parallelismo per la query che specifica questa opzione.

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

Questa opzione sovrascrive l'opzione di configurazione MAXDOP di sp_configure e Resource Governor. Se MAXDOP è impostato su zero, il server sceglie il grado massimo di parallelismo.

INDICE Suggerimenti

I suggerimenti dell'indice vengono utilizzati per forzare una query a utilizzare un indice specifico, invece di consentire allo Strumento di ottimizzazione query di SQL Server di scegliere ciò che ritiene l'indice migliore. In alcuni casi è possibile ottenere vantaggi specificando l'indice che deve essere utilizzato da una query. Generalmente, Query Optimizer di SQL Server sceglie l'indice migliore adatto per la query, ma a causa di statistiche mancanti o obsolete o di esigenze specifiche è possibile forzarlo.

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow