2015-04-22 4 views
11

Non sono chiaro sulla differenza di lavoro tra le query menzionate di seguito.Loop Join in SQL Server 2008

In particolare, non mi è chiaro il concetto di OPTION(LOOP JOIN).

primo approccio: si tratta di un tradizionale join utilizzato, che è più costoso di tutti i sotto.

SELECT * 
FROM [Item Detail] a 
LEFT JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (FORCE ORDER); 

secondo approccio: Esso include OPTION in una dichiarazione con i dati ordinati, semplicemente ottimizzati.

SELECT * 
FROM [Item Detail] a 
LEFT LOOP JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (FORCE ORDER); 

terzo approccio: Ecco, non mi è chiaro, come funziona la query e comprende OPTION con loop join !!?

SELECT * 
FROM [Item Detail] a 
LEFT LOOP JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (LOOP JOIN); 

Qualcuno può spiegare la differenza e il modo di lavorare e vantaggi di ciascuno rispetto ad altri?

Nota: Questi sono non Nested O Hash loop!

+1

documentazione: [Query Hints] (https://msdn.microsoft.com/en-us/library/ms181714.aspx) e [Join Hints] (https://msdn.microsoft.com/en-GB /library/ms173815.aspx) – Tanner

+0

Perché secondo voi il primo approccio è "il più costoso di tutti sotto"? – Magnus

+0

L'ho provato con il mio server locale e ho ottenuto la massima differenza! e, naturalmente, la differenza era compresa tra +2 e +3 secondi solo – Vikrant

risposta

7

Da Query Hints (Transact-SQL)

FORCE ORDER Specifica che l'ordine di join indicato dalla sintassi di query è conservato durante l'ottimizzazione delle query. L'uso di ORDINE DI FORZA fa sì che non influenzi il possibile comportamento di inversione di ruolo di Query Optimizer.

anche

{LOOP | MERGE | HASH} JOIN Specifica che tutte le operazioni di join sono eseguite da LOOP JOIN, MERGE JOIN o HASH JOIN nell'intera query. Se viene specificato più di un suggerimento di join, l'ottimizzatore seleziona la strategia di join meno costosa da quelle consentite.

Advanced Query Tuning Concepts

Se uno join ingresso è piccolo (meno di 10 righe) e l'altro join ingresso è abbastanza grande e indicizzati sul suo aderire colonne, un indice annidato loop join è il più veloce operazione di join perché richiedono l'I/O minimo e il minor numero di confronti.

Se i due uniscono ingressi non sono piccole, ma sono ordinati nel loro unirsi colonna (ad esempio, se sono stati ottenuti mediante scansione ordinati indici), un merge join è l'operazione più veloce join.

I join di hash possono elaborare in modo efficiente input di grandi dimensioni, non ordinati e non indeterminati.

E Join Hints (Transact-SQL)

JOIN suggerimenti specificano che l'ottimizzatore di query esecuzione di una strategia di join tra due tabelle

L'opzione 1 racconta l'ottimizzatore per mantenere l'ordine di join come è. Quindi il tipo JOIN può essere deciso dall'ottimizzatore, quindi potrebbe essere MERGE JOIN.

L'opzione 2 indica all'ottimizzatore di utilizzare LOOP JOIN per questo specifico JOIN. Se c'erano altri join nella sezione FROM, l'ottimizzatore sarebbe in grado di decidere per loro. Inoltre, stai specificando l'ordine di JOINS da prendere per l'ottimizzatore.

L'ultima opzione OPTION (LOOP JOIN) imporrà LOOP JOIN attraverso tutti i join nella query.

Ciò detto, è molto raro che l'ottimizzatore scelga un piano errato, e questo probabilmente dovrebbe indicare problemi di fondo più grandi, come statistiche obsolete o indici frammentati.