Grado di parallelismo

In SQL Server viene rilevato automaticamente il grado di parallelismo ottimale per ogni istanza di esecuzione parallela di una query o di operazione DDL sull'indice, utilizzando i criteri seguenti:

  1. Esecuzione di SQL Server in un computer con più microprocessori o CPU, ad esempio un computer SMP (Symmetric Multiprocessing).

    Solo i computer con più CPU possono utilizzare le query parallele.

  2. Disponibilità di un numero sufficiente di thread.

    Per l'esecuzione di una query o di un'operazione su un indice è necessario un numero specifico di thread. L'esecuzione di un piano parallelo richiede un numero di thread maggiore rispetto all'esecuzione di un piano seriale e il numero di thread necessari aumenta con il grado di parallelismo. Se non è possibile rispettare i requisiti di thread del piano parallelo per un grado di parallelismo specifico, Motore di database aumenta automaticamente il grado di parallelismo o annulla completamente il piano parallelo nel contesto del piano di lavoro specificato ed esegue il piano seriale (un thread).

  3. Tipo di query o di operazione sull'indice eseguita.

    Le operazioni di creazione o ricostruzione di un indice o di eliminazione di un indice cluster e le query che utilizzano molte risorse CPU sono candidate ideali per un piano parallelo. Esempi di operazioni di questo tipo sono i join di tabelle di grandi dimensioni, le aggregazioni di ampia portata e gli ordinamenti di set di risultati estesi. Nel caso di query semplici, spesso presenti nelle applicazioni di elaborazione delle transazioni, il coordinamento aggiuntivo necessario per eseguire una query in parallelo viene compensato dal potenziale miglioramento delle prestazioni. Per distinguere le query che possono trarre vantaggio dal parallelismo, Motore di database confronta il costo stimato per l'esecuzione della query o dell'operazione sull'indice con il valore cost threshold for parallelism. È possibile, ma non consigliabile, modificare il valore predefinito (pari a 5) utilizzando sp_configure.

  4. Presenza di un numero sufficiente di righe da elaborare.

    Se Query Optimizer determina che il numero di righe di un flusso è troppo basso, non introduce gli operatori di scambio per la distribuzione delle righe. Gli operatori vengono pertanto eseguiti in modo seriale, evitando così le situazioni in cui il costo di avvio, distribuzione e coordinamento supera i vantaggi ottenuti tramite l'esecuzione parallela dell'operatore.

  5. Disponibilità di statistiche di distribuzione correnti.

    Se il grado di parallelismo massimo non è disponibile, prima di annullare il piano parallelo vengono considerati i gradi inferiori.

    Ad esempio, quando si crea un indice cluster in una vista, non è possibile valutare le statistiche di distribuzione perché l'indice cluster non esiste ancora. In questo caso, Motore di database non può fornire il grado di parallelismo massimo per l'operazione sull'indice. Alcuni operatori, ad esempio quelli relativi all'ordinamento e alla scansione, possono tuttavia trarre vantaggi dall'esecuzione parallela.

[!NOTA]

Le operazioni parallele sugli indici sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.

Al momento dell'esecuzione, Motore di database determina se il carico di lavoro di sistema corrente e i dati di configurazione illustrati in precedenza consentono l'esecuzione parallela. Se l'esecuzione parallela è possibile, Motore di database determina il numero ottimale di thread e suddivide l'esecuzione del piano parallelo tra i thread. Dal momento in cui viene avviata l'esecuzione parallela su più thread di una query o di un'operazione sull'indice, viene utilizzato lo stesso numero di thread fino al completamento dell'operazione. Motore di database riesamina il numero ottimale di thread ogni volta che viene recuperato un piano di esecuzione dalla cache della procedura. Ad esempio, l'esecuzione di una query può comportare l'utilizzo di un piano seriale, un'esecuzione successiva della stessa query può richiedere un piano parallelo che utilizza tre thread e una terza esecuzione può richiedere un piano parallelo con quattro thread.

In un piano di esecuzione parallela della query, gli operatori insert, update e delete vengono eseguiti in modo seriale. La clausola WHERE di un'istruzione UPDATE o DELETE oppure la parte SELECT di un'istruzione INSERT possono tuttavia essere eseguite in parallelo. Le modifiche apportate ai dati verranno quindi applicate in modo seriale al database.

I cursori statici e gestiti da keyset possono essere popolati tramite piani di esecuzione parallela. La funzionalità dei cursori dinamici può invece essere implementata solo tramite l'esecuzione seriale. Query Optimizer genera sempre un piano di esecuzione seriale per le query che fanno parte di un cursore dinamico.

Sostituzione dei gradi di parallelismo

È possibile utilizzare l'opzione di configurazione del server max degree of parallelism per limitare il numero di processori da utilizzare per l'esecuzione del piano parallelo. L'opzione max degree of parallelism può essere ignorata per le singole istruzioni delle query e delle operazioni sugli indici specificando l'hint per le query MAXDOP o l'opzione per gli indici MAXDOP. MAXDOP offre un maggiore controllo sulle singole query e operazioni sugli indici. Ad esempio, è possibile utilizzare questa opzione per aumentare o diminuire il numero di processori dedicati a un'operazione sull'indice in linea. Ciò consente di bilanciare le risorse utilizzate per un'operazione sull'indice con quelle degli utenti simultanei.