Se un'istanza è MAXDOP
impostata su 1 e gli hint di query vengono utilizzati per consentire a query specifiche di andare in parallelo, il valore Soglia di costo per parallelismo è ancora utilizzato da SQL per decidere se andare effettivamente in parallelo?
Risposta semplice: sì .
Dettagli
Ci sono un paio di cose separate in corso qui, che è importante separare:
Qual è il grado massimo di parallelismo effettivo disponibile per una query?
I partecipanti a questo sono (sostanzialmente in ordine di importanza):
MAX_DOP
Impostazione del Resource Governor
MAXDOP
Impostazione suggerimento query
- L'
max degree of parallelism
opzione di configurazione dell'istanza
I dettagli sono spiegati nell'impostazione "Max Degree of Parallelism" del server, MAX_DOP di Resource Governor e suggerimento per le query MAXDOP - quale dovrebbe essere usato da SQL Server? di Jack Li, Senior Escalation Engineer per Microsoft SQL Server Servizio clienti. La tabella seguente è riprodotta da quel link:
Un piano di query utilizzerà il parallelismo?
Query Optimizer di SQL Server trova sempre prima un piano seriale *.
Quindi, se:
- Un'ulteriore ottimizzazione è giustificata; e
- Il costo del miglior piano seriale supera il
cost threshold for parallelism
valore di configurazione
... l'ottimizzatore proverà a trovare un piano parallelo.
Quindi, se:
- È stato trovato un piano parallelo (cioè è possibile); e
- Il costo del piano parallelo è inferiore al miglior piano seriale
... verrà prodotto un piano parallelo.
Nota: l' cost threshold for parallelism
unico effetto se l'ottimizzatore cerca un piano parallelo. Una volta memorizzato nella cache un piano parallelo, verrà eseguito utilizzando il parallelismo quando viene riutilizzato (purché siano disponibili thread) indipendentemente dall'impostazione CTFP.
Esempi
Per entrambi gli esempi, con istanza maxdop 1 e suggerimento query maxdop 2, il DOP disponibile effettivo è 2. Se viene scelto un piano parallelo, utilizzerà DOP 2.
Esempio 1
Dato CTFP di 50 e un piano seriale più economico trovato costo di 30, SQL Server non proverà a trovare un piano parallelo. Verrà prodotto un piano seriale.
Esempio 2
Dato CTFP di 50 e un piano seriale più economico trovato costo di 70, SQL Server proverà a trovare un piano parallelo. Se questo piano (se trovato) ha un costo inferiore a 70 (il costo del piano seriale) verrà prodotto un piano parallelo.
Il risultato finale dell'ottimizzazione delle query è sempre un singolo piano memorizzato nella cache: seriale o parallelo. L'ottimizzatore trova solo un piano seriale nelle fasi search0 (TP) e search1 (QP).
Si può allora (come descritto) rieseguire search1 con un requisito di produrre un piano parallelo. Viene quindi fatta una scelta tra seriale e parallelo sulla base del miglior costo dell'intero piano finora. Tale scelta è vincolante nel caso in cui l'ottimizzazione passi a search2 (Ottimizzazione completa). Ogni fase di ottimizzazione considera molte alternative, ma l'output da uno stage è sempre un singolo piano migliore, che è seriale o parallelo.
Di questo ho scritto in Myth: SQL Server memorizza nella cache un piano seriale con ogni piano parallelo