Elaborazione di query adattive nei database SQLAdaptive query processing in SQL databases

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2017)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2017)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Questo articolo presenta funzionalità per l'elaborazione di query adattive che consentono di migliorare le prestazioni delle query in SQL Server e nel database SQL di Azure:This article introduces these adaptive query processing features that you can use to improve query performance in SQL Server and Azure SQL Database:

  • Feedback delle concessioni di memoria in modalità batch.Batch mode memory grant feedback.
  • Join adattivo in modalità batch.Batch mode adaptive join.
  • Esecuzione interleaved.Interleaved execution.

A livello generale una query di SQL Server viene eseguita come indicato di seguito:At a general level, SQL Server executes a query as follows:

  1. Il processo di ottimizzazione query genera un set di piani di esecuzione possibili per una query specifica.The query optimization process generates a set of feasible execution plans for a specific query. In questa fase viene stimato il costo dei vari piani e viene usato il piano con il costo stimato minore.During this time, the cost of plan options is estimated and the plan with the lowest estimated cost is used.
  2. Il processo di esecuzione query seleziona il piano scelto da Query Optimizer e lo usa per l'esecuzione.The query execution process takes the plan chosen by the query optimizer and uses it for execution.

In alcuni casi il piano scelto da Query Optimizer non è ottimale per diversi motivi.Sometimes the plan chosen by the query optimizer is not optimal for a variety of reasons. Ad esempio è possibile che il numero stimato di righe del flusso del piano di query non sia corretto.For example, the estimated number of rows flowing through the query plan may be incorrect. I costi stimati aiutano a determinare il piano che viene selezionato per l'uso nell'esecuzione.The estimated costs help determine which plan gets selected for use in execution. Se le stime di cardinalità non sono corrette viene comunque usato il piano originale anche se le ipotesi di partenza non erano adeguate.If cardinality estimates are incorrect, the original plan is still used despite the poor original assumptions.

Funzionalità dell'elaborazione di query adattive

Come abilitare l'elaborazione di query adattiveHow to enable adaptive query processing

È possibile impostare automaticamente i carichi di lavoro come idonei all'elaborazione di query adattive abilitando il livello di compatibilità 140 per il database.You can make workloads automatically eligible for adaptive query processing by enabling compatibility level 140 for the database. Questa opzione è impostabile con Transact-SQL.You can set this using Transact-SQL. Esempio:For example:

ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140;

Feedback delle concessioni di memoria in modalità batchBatch mode memory grant feedback

Un piano post esecuzione di una query in SQL Server include la memoria minima richiesta per l'esecuzione e la dimensione della concessione di memoria sufficiente a far sì che tutte le righe siano incluse nella memoria.A query’s post-execution plan in SQL Server includes the minimum required memory needed for execution and the ideal memory grant size to have all rows fit in memory. Se le dimensioni della concessione di memoria non vengono impostate correttamente le prestazioni possono risultare ridotte.Performance suffers when memory grant sizes are incorrectly sized. Le concessioni di dimensioni eccessive causano memoria non usata e riduzione della concorrenza.Excessive grants result in wasted memory and reduced concurrency. Le concessioni di memoria di dimensioni insufficienti causano costose distribuzioni su disco.Insufficient memory grants cause expensive spills to disk. Incentrandosi sui carichi di lavoro ripetuti, il feedback delle concessioni di memoria in modalità batch ricalcola la memoria effettiva necessaria per una query, quindi aggiorna il valore della concessione per il piano nella cache.By addressing repeating workloads, batch mode memory grant feedback recalculates the actual memory required for a query and then updates the grant value for the cached plan. Quando viene eseguita un'istruzione query identica la query usa le dimensioni della concessione di memoria aggiornate, riducendo il numero eccessivo di concessioni che limita la concorrenza e correggendo il numero insufficiente di concessioni che causa costose distribuzioni su disco.When an identical query statement is executed, the query uses the revised memory grant size, reducing excessive memory grants that impact concurrency and fixing underestimated memory grants that cause expensive spills to disk. Il grafico seguente visualizza un esempio dell'uso del feedback delle concessioni di memoria in modalità batch.The following graph shows one example of using batch mode adaptive memory grant feedback. La durata della prima esecuzione della query è pari a 88 secondi a causa del numero elevato di distribuzioni:For the first execution of the query, duration was 88 seconds due to high spills:

DECLARE @EndTime datetime = '2016-09-22 00:00:00.000';
DECLARE @StartTime datetime = '2016-09-15 00:00:00.000';
SELECT TOP 10 hash_unique_bigint_id
FROM dbo.TelemetryDS
WHERE Timestamp BETWEEN @StartTime and @EndTime
GROUP BY hash_unique_bigint_id
ORDER BY MAX(max_elapsed_time_microsec) DESC;

Numero elevato di distribuzioni

Con il feedback delle concessioni di memoria attivato la durata della seconda esecuzione della query si riduce a 1 secondo (da 88 secondi), le distribuzioni su disco vengono rimosse completamente e la concessione è superiore:With memory grant feedback enabled, for the second execution, duration is 1 second (down from 88 seconds), spills are removed entirely, and the grant is higher:

Nessuna distribuzione

Dimensionamento tramite il feedback delle concessioni di memoriaMemory grant feedback sizing

Per le concessioni di memoria di dimensioni eccessive se la memoria per le concessioni supera di oltre due volte la quantità di memoria realmente usata, il feedback delle concessioni di memoria ricalcola la concessione e aggiorna il piano memorizzato nella cache.For excessive grants, if the granted memory is more than two times the size of the actual used memory, memory grant feedback will recalculate the memory grant and update the cached plan. I piani con concessioni di memoria di dimensioni inferiori a 1 MB non vengono ricalcolati per le eccedenze.Plans with memory grants under 1 MB will not be recalculated for overages. Per le concessioni di memoria di dimensioni insufficienti che generano distribuzioni su disco per gli operatori in modalità batch, il feedback delle concessioni di memoria attiva il ricalcolo della concessione di memoria.For insufficiently sized memory grants that result in a spill to disk for batch mode operators, memory grant feedback will trigger a recalculation of the memory grant. Gli eventi di distribuzione vengono segnalati al feedback delle concessioni di memoria e possono essere esposti con l'evento XEvent spilling_report_to_memory_grant_feedback.Spill events are reported to memory grant feedback and can be surfaced via the spilling_report_to_memory_grant_feedback XEvent event. Questo evento restituisce l'ID del nodo dal piano e il volume dei dati distribuiti su disco da tale nodo.This event returns the node id from the plan and spilled data size of that node.

Feedback delle concessioni di memoria e scenari dipendenti dai parametriMemory grant feedback and parameter sensitive scenarios

Per risultati ottimali, valori dei parametri diversi possono richiedere piani di query diversi.Different parameter values may also require different query plans in order to remain optimal. Le query di questo tipo sono definite "sensibili ai parametri".This type of query is defined as “parameter-sensitive.” Per i piani sensibili ai parametri il feedback delle concessioni di memoria si disattiva quando una query registra requisiti di memoria non stabili.For parameter-sensitive plans, memory grant feedback will disable itself on a query if it has unstable memory requirements. Il piano viene disattivato dopo varie ripetizioni dell'esecuzione della query e la disattivazione può essere rilevata monitorando l'evento XEvent memory_grant_feedback_loop_disabled.The plan is disabled after several repeated runs of the query and this can be observed by monitoring the memory_grant_feedback_loop_disabled XEvent.

Memorizzazione nella cache del feedback delle concessioni di memoriaMemory grant feedback caching

Il feedback può essere archiviato nel piano memorizzato nella cache per una singola esecuzione.Feedback can be stored in the cached plan for a single execution. Tuttavia i vantaggi del feedback delle concessioni di memoria appaiono in caso di esecuzioni consecutive dell'istruzione.It is the consecutive executions of that statement, however, that benefit from the memory grant feedback adjustments. Questa funzionalità si applica all'esecuzione ripetuta di istruzioni.This feature applies to repeated execution of statements. Il feedback delle concessioni di memoria modifica solo il piano memorizzato nella cache.Memory grant feedback will change only the cached plan. Attualmente le modifiche non vengono acquisite nell'elemento Ssore della query.Changes are currently not captured in the query Ssore. Se il piano viene rimosso dalla cache il feedback non viene mantenuto.Feedback is not persisted if the plan is evicted from cache. Il feedback va perduto anche nel caso di un failover.Feedback will also be lost if there is a failover. Un'istruzione che usa OPTION(RECOMPILE) crea un nuovo piano e non lo memorizza nella cache.A statement using OPTION(RECOMPILE) creates a new plan and does not cache it. Dato che il piano non è memorizzato nella cache il feedback delle concessioni di memoria non viene generato e non viene archiviato per la compilazione e l'esecuzione.Since it is not cached, no memory grant feedback is produced and it is not stored for that compilation and execution. Se tuttavia un'istruzione equivalente (con lo stesso hash di query) che non ha usato OPTION(RECOMPILE) è stata memorizzata nella cache e quindi rieseguita, l'istruzione consecutiva può trarre vantaggio dal feedback delle concessioni di memoria.However, if an equivalent statement (that is, with the same query hash) that did not use OPTION(RECOMPILE) was cached and then re-executed, the consecutive statement can benefit from memory grant feedback.

Rilevamento delle attività di feedback delle concessioni di memoriaTracking memory grant feedback activity

È possibile tenere traccia di eventi di feedback delle concessioni di memoria usando l'evento XEvent memory_grant_updated_by_feedback.You can track memory grant feedback events using the memory_grant_updated_by_feedback XEvent event. Questo evento rileva la cronologia del conteggio di esecuzione corrente, il numero di volte per il quale il piano è stato aggiornato dal feedback delle concessioni di memoria, la concessione di memoria aggiuntiva ideale prima della modifica e la concessione di memoria aggiuntiva ideale dopo che il feedback delle concessioni di memoria ha modificato il piano salvato nella cache.This event tracks the current execution count history, the number of times the plan has been updated by memory grant feedback, the ideal additional memory grant before modification and the ideal additional memory grant after memory grant feedback has modified the cached plan.

Feedback delle concessioni di memoria, Resource Governor e hint per la queryMemory grant feedback, resource governor and query hints

La memoria concessa reale è conforme al limite di memoria per le query determinato da Resource Governor o dall'hint per la query.The actual memory granted honors the query memory limit determined by the resource governor or query hint.

Join adattivi in modalità batchBatch mode adaptive joins

La funzionalità di join adattivo in modalità batch consente di rimandare a dopo la scansione del primo input la scelta tra l'esecuzione di un metodo hash join e l'esecuzione di un metodo join a cicli annidati.The batch mode adaptive joins feature enables the choice of a hash join or nested loop join method to be deferred until after the first input has been scanned. L'operatore di join adattivo definisce una soglia che viene usata per stabilire quando passare a un piano a cicli annidati.The adaptive join operator defines a threshold that is used to decide when to switch to a nested loop plan. Durante l'esecuzione il piano può pertanto passare a una strategia di join più efficace.Your plan can therefore dynamically switch to a better join strategy during execution. Il funzionamento è il seguente:Here’s how it works:

  • Se il conteggio delle righe dell'input del join di compilazione è così ridotto che un join a cicli annidati è preferibile a un hash join, il piano passa a un algoritmo a cicli annidati.If the row count of the build join input is small enough that a nested loop join would be more optimal than a hash join, your plan switches to a nested loop algorithm.
  • Se l'input del join di compilazione supera una determinata soglia di numero di righe non si verifica alcun cambiamento e il piano continua con un hash join.If the build join input exceeds a specific row count threshold, no switch occurs and your plan continues with a hash join.

La query seguente illustra un esempio di join adattivo:The following query is used to illustrate an adaptive join example:

SELECT  [fo].[Order Key], [si].[Lead Time Days],
[fo].[Quantity]
FROM    [Fact].[Order] AS [fo]
INNER JOIN [Dimension].[Stock Item] AS [si]
       ON [fo].[Stock Item Key] = [si].[Stock Item Key]
WHERE   [fo].[Quantity] = 360;

La query restituisce 336 righe.The query returns 336 rows. Se si attiva Statistiche query dinamiche viene visualizzato il piano seguente:Enabling Live Query Statistics we see the following plan:

Risultato della query: 336 righe

Nel piano viene visualizzato quanto segue:In the plan, we see the following:

  • È presente un'Analisi indice Columnstore che specifica righe per la fase di compilazione dell'hash join.We have a columnstore index scan used to provide rows for the hash join build phase.
  • È presente il nuovo operatore di join adattivo.We have the new adaptive join operator. L'operatore definisce la soglia usata per il passaggio a un piano con ciclo annidato.This operator defines a threshold that is used to decide when to switch to a nested loop plan. In questo esempio la soglia corrisponde a 78 righe.For our example, the threshold is 78 rows. Se il risultato è >= 78 righe verrà usato un hash join.Anything with >= 78 rows will use a hash join. Se è inferiore alla soglia verrà usato un join a cicli annidati.If less than the threshold, a nested loop join will be used.
  • Dato che le righe restituite sono 336, la soglia viene superata: il secondo ramo rappresenta la fase di probe di un'operazione hash join standard.Since we return 336 rows, we are exceeding the threshold and so the second branch represents the probe phase of a standard hash join operation. Si noti che Statistiche sulle query dinamiche visualizza le righe del flusso tra gli operatori, in questo caso "672 di 672".Notice that Live Query Statistics shows rows flowing through the operators – in this case “672 of 672”.
  • L'ultimo ramo è la Ricerca indice cluster che il join a cicli annidati avrebbe usato se la soglia non fosse stata superata.And the last branch is our Clustered Index Seek for use by the nested loop join had the threshold not been exceeded. Il valore visualizzato è "0 di 336" righe (il ramo non viene usato).Notice that we see “0 of 336” rows displayed (the branch is unused). Ora si confronti il piano con la stessa query che tuttavia nella tabella restituisce una quantità pari a una sola riga:Now let’s contrast the plan with the same query, but this time for a Quantity value that only has one row in the table:
SELECT  [fo].[Order Key], [si].[Lead Time Days],
[fo].[Quantity]
FROM    [Fact].[Order] AS [fo]
INNER JOIN [Dimension].[Stock Item] AS [si]
       ON [fo].[Stock Item Key] = [si].[Stock Item Key]
WHERE   [fo].[Quantity] = 361;

La query restituisce una riga.The query returns one row. Se si attiva Statistiche query dinamiche viene visualizzato il piano seguente:Enabling Live Query Statistics we see the following plan:

Risultato della query: una riga

Nel piano viene visualizzato quanto segue:In the plan, we see the following:

  • Dato che viene restituita una sola riga, ora il flusso di righe attraversa Ricerca indice cluster.With one row returned, you see the Clustered Index Seek now has rows flowing through it.
  • Dato che non è stata portata avanti la fase di compilazione dell'hash join, nessuna riga attraversa il secondo ramo.And since we did not continue with the hash join build phase, you’ll see zero rows flowing through the second branch.

Vantaggi del join adattivoAdaptive join benefits

Questa funzionalità è ottimale per i carichi di lavoro con frequenti oscillazioni tra i volumi di input di join rilevati.Workloads with frequent oscillations between small and large join input scans will benefit most from this feature.

Sovraccarichi del join adattivoAdaptive join overhead

I join adattivi presentano requisiti di memoria superiori rispetto a un piano equivalente con join a cicli annidati indicizzati.Adaptive joins introduce a higher memory requirement than an index nested loop join equivalent plan. La memoria aggiuntiva risulta necessaria, come se il join a cicli annidati fosse un hash join.The additional memory is requested as if the nested loop was a hash join. Si registra un sovraccarico anche per la fase di compilazione come operazione stop-and-go rispetto a un join a cicli annidati equivalente a livello di flussi.There is also overhead for the build phase as a stop-and-go operation versus a nested loop streaming equivalent join. A tale costo aggiuntivo corrisponde una maggior flessibilità per gli scenari in cui i conteggi delle righe possono variare nell'input di compilazione.With that additional cost comes flexibility for scenarios where row counts may fluctuate in the build input.

Memorizzazione nella cache e riuso dei join adattiviAdaptive join caching and re-use

I join adattivi in modalità batch funzionano per l'esecuzione iniziale di un'istruzione. Dopo la compilazione, le esecuzioni consecutive restano adattive sulla base della soglia di join adattivo di compilazione e delle righe di runtime del flusso di dati della fase di compilazione dell'input esterno.Batch mode adaptive joins work for the initial execution of a statement, and once compiled, consecutive executions will remain adaptive based on the compiled adaptive join threshold and the runtime rows flowing through the build phase of the outer input.

Rilevamento delle attività di join adattivoTracking adaptive join activity

L'operatore di join adattivo ha i seguenti attributi dell'operatore del piano:The adaptive join operator has the following plan operator attributes:

Attributo del pianoPlan attribute DescriptionDescription
AdaptiveThresholdRowsAdaptiveThresholdRows Visualizza l'uso della soglia che determina il passaggio da un hash join a un join a cicli annidati.Shows the threshold use to switch from a hash join to nested loop join.
EstimatedJoinTypeEstimatedJoinType Probabile tipo del join.What the join type is likely to be.
ActualJoinTypeActualJoinType In un piano reale visualizza l'algoritmo di join scelto in base alla soglia.In an actual plan, shows what join algorithm was ultimately chosen based on the threshold.

Il piano stimato visualizza la struttura del piano di join adattivo, la soglia di join adattivo definita e il tipo di join stimato.The estimated plan shows the adaptive join plan shape, along with a defined adaptive join threshold and estimated join type.

Interoperabilità tra join adattivi e Archivio queryAdaptive join and Query Store interoperability

Archivio query acquisisce e può imporre un piano di join adattivo in modalità batch.Query Store captures and is able to force a batch mode adaptive join plan.

Istruzioni idonee per i join adattiviAdaptive join eligible statements

Alcune condizioni rendono un join logico idoneo per un join adattivo in modalità batch:A few conditions make a logical join eligible for a batch mode adaptive join:

  • Il livello di compatibilità del database è 140The database compatibility level is 140
  • La query è un'istruzione SELECT (attualmente le istruzioni di modifica dei dati non sono idonee)The query is a SELECT statement (data modification statements are currently ineligible)
  • Il join è idoneo per l'esecuzione in un algoritmo fisico di join a cicli annidati indicizzati o di hash joinThe join is eligible to be executed both by an indexed nested loop join or a hash join physical algorithm
  • L'hash join usa la modalità batch con un indice Columnstore nella query globale o una tabella Columnstore indicizzata alla quale fa riferimento direttamente il joinThe hash join uses batch mode – either through the presence of a Columnstore index in the query overall or a Columnstore indexed table being referenced directly by the join
  • Il primo elemento figlio (riferimento esterno) deve essere identico per le soluzioni alternative generate dal join a cicli annidati e dall'hash joinThe generated alternative solutions of the nested loop join and hash join should have the same first child (outer reference)

Efficienza dei join adattivi e dei join a cicli annidatiAdaptive joins and nested loop efficiency

Se un join adattivo passa al funzionamento con cicli annidati usa le righe già lette dalla compilazione hash join.If an adaptive join switches to a nested loop operation, it uses the rows already read by the hash join build. L'operatore non legge di nuovo le righe del riferimento esterno.The operator does not re-read the outer reference rows again.

Righe della soglia adattivaAdaptive threshold rows

Il grafico seguente visualizza un esempio di intersezione tra il costo di un hash join e il costo di un join a cicli annidati alternativo.The following chart shows an example intersection between the cost of a hash join vs. the cost of a nested loop join alternative. In questo punto di intersezione viene determinata la soglia, che a sua volta determina l'algoritmo usato per l'operazione di join.At this intersection point, the threshold is determined that in turn determines the actual algorithm used for the join operation.

Soglia di join

Esecuzione interleaved per funzioni con valori di tabella a più istruzioniInterleaved execution for multi-statement table valued functions

L'esecuzione interleaved cambia il limite unidirezionale tra le fasi di ottimizzazione ed esecuzione nel caso di un'esecuzione a query singola e consente l'adattamento dei piani in base alle stime di cardinalità aggiornate.Interleaved execution changes the unidirectional boundary between the optimization and execution phases for a single-query execution and enables plans to adapt based on the revised cardinality estimates. Se durante l'ottimizzazione viene rilevato un candidato per l'esecuzione interleaved, che attualmente corrisponde a una funzione con valori di tabella a più istruzioni (MSTVF, Multi-Statement Table Valued Function) si sospende l'ottimizzazione, si esegue il sottoalbero appropriato, si acquisiscono stime di cardinalità accurate e quindi si riprende l'ottimizzazione per le operazioni downstream.During optimization if we encounter a candidate for interleaved execution, which is currently multi-statement table valued functions (MSTVFs), we will pause optimization, execute the applicable subtree, capture accurate cardinality estimates, and then resume optimization for downstream operations. Le funzioni MSTVF hanno una stima di cardinalità predefinita pari a "100" in SQL Server 2014 e SQL Server 2016 e pari a "1" nelle versioni precedenti.MSTVFs have a fixed cardinality guess of “100” in SQL Server 2014 and SQL Server 2016, and “1” for earlier versions. L'esecuzione interleaved riduce i problemi di prestazioni del carico di lavoro dovute alle stime della cardinalità fisse associate alle funzioni con valori di tabella a più istruzioni.Interleaved execution helps workload performance issues that are due to these fixed cardinality estimates associated with multi-statement table valued functions.

L'immagine seguente visualizza un output di statistiche query in tempo reale, un subset di un piano di esecuzione complessivo che visualizza l'impatto delle stime della cardinalità fisse da funzioni MSTVF.The following image depicts a live query statistis ouput, a subset of an overall execution plan that shows the impact of fixed cardinality estimates from MSTVFs. È possibile visualizzare il flusso di righe effettivo e le righe stimate.You can see the actual row flow vs. estimated rows. Tre aree del piano sono degne di nota (il flusso va da destra a sinistra):There are three noteworhy areas of the plan (flow is from right to left):

  1. L'analisi di tabella MSTVF include una stima fissa pari a 100 righe.The MSTVF Table Scan has a fixed estimate of 100 rows. In questo esempio tuttavia il flusso della scansione tabella MSTVF registra 527.597 righe, come visualizzato in Statistiche query dinamiche nel confronto "527597 di 100" tra valore effettivo e valore stimato. Si tratta di una deviazione notevole rispetto alla stima fissa.For this example, however, there are 527,597 rows flowing through this MSTVF Table Scan as seen in Live Query Statistics via the “527597 of 100” actual of estimated – so the fixed estimate is significantly skewed.
  2. Per l'operazione di join a cicli annidati è previsto che il lato esterno del join restituisca solo 100 righe.For the Nested Loops operation, only 100 rows are assumed to be returned by the outer side of the join. Dato l'elevato numero di righe di fatto restituite dalla funzione MSTVF, in questo caso può risultare utile la scelta di un altro algoritmo di join.Given the high number of rows actually being returned by the MSTVF, you are likely better off with a different join algorithm altogether.
  3. Per l'operazione Hash Match osservare il piccolo simbolo di avviso, che in questo caso indica un evento di distribuzione su disco.For the Hash Match operation, notice the small warning symbol, which in this case is indicating a spill to disk.

Flusso di righe effettivo e righe stimate

Confrontare il piano precedente al piano reale generato con l'esecuzione interleaved attivata:Contrast the prior plan with the actual plan generated with interleaved execution enabled:

Piano interleaved

  1. Si noti che la scansione di tabella MSTVF ora presenta una stima di cardinalità accurata.Notice that the MSTVF table scan now reflects an accurate cardinality estimate. Si noti anche il riordino della scansione di tabella e delle altre operazioni.Also notice the re-ordering of this table scan and the other operations.
  2. Quanto agli algoritmi di join l'operazione di join a cicli annidati è stata sostituita da un'operazione Hash Match, più indicata con un numero di righe molto elevato.And regarding join algorithms, we have switched from a Nested Loop operation to a Hash Match operation instead, which is more optimal given the large number of rows involved.
  3. Si noti anche che gli avvisi di distribuzione su disco non sono più presenti, in quanto viene allocata una maggior quantità di memoria sulla base del conteggio reale delle righe del flusso della scansione di tabella MSTVF.Also notice that we no longer have spill-warnings, as we’re granting more memory based on the true row count flowing from the MSTVF table scan.

Istruzioni idonee per l'esecuzione interleavedInterleaved execution eligible statements

Attualmente le funzioni MSTVF che fanno riferimento a istruzioni nell'esecuzione interleaved devono essere di sola lettura e non far parte di un'operazione di modifica dei dati.MSTVF referencing statements in interleaved execution must currently be read-only and not part of a data modification operation. Inoltre le funzioni MSTVF non sono idonee per l'esecuzione interleaved se vengono usate all'interno di un operatore CROSS APPLY.Also, the MSTVFs are not be eligible for interleaved execution if they are used on the inside of a CROSS APPLY.

Vantaggi dell'esecuzione interleavedInterleaved execution benefits

In generale, maggiore è lo scarto tra il numero di righe stimato e il numero reale (associato al numero di operazioni del piano downstream), maggiore è l'impatto sulle prestazioni.In general, the higher the skew between the estimated vs. actual number of rows, coupled with the number of downstream plan operations, the greater the performance impact. L'esecuzione interleaved può risultare vantaggiosa nelle query in cui:In general, interleaved execution benefits queries where:

  1. Si registra uno scarto notevole tra il numero di righe stimato e il numero reale nel set di risultati intermedio (in questo caso la funzione MSTVF).There is a large skew between the estimated vs. actual number of rows for the intermediate result set (in this case, the MSTVF), and…
  2. La query nel suo complesso è sensibile alla variazione delle dimensioni del risultato intermedio.…the overall query is sensitive to a change in the size of the intermediate result. Ciò accade di solito quando nel piano della query è presente un albero complesso sopra il sottoalbero.This typically happens when there is a complex tree above that subtree in the query plan. Una semplice istruzione "SELECT *" di una funzione MSTVF non trae vantaggio dall'esecuzione interleaved.A simply "SELECT *" from an MSTVF will not benefit from interleaved execution.

Sovraccarichi dell'esecuzione interleavedInterleaved execution overhead

Il sovraccarico previsto è minimo o nullo.The overhead should be minimal-to-none. Le funzione con valori di tabella a più istruzioni venivano già materializzate prima dell'introduzione dell'esecuzione interleaved, ma ora grazie all'abilitazione dell'ottimizzazione differita tali funzioni sfruttano la stima della cardinalità del set di righe materializzate.MSTVFs were already being materialized prior to the introduction of interleaved execution, however the difference is that now we’re now allowing deferred optimization and are then leveraging the cardinality estimate of the materialized row set. È possibile che in seguito alle modifiche alcuni piani registrino un miglioramento della cardinalità per il sottoalbero ma una riduzione dell'efficienza per la query nel suo complesso.As with any plan affecting changes, some plans could change such that with better cardinality for the subtree we get a worse plan for the query overall. La prevenzione può includere il ripristino del livello di compatibilità o l'uso dell'Archivio query per imporre la versione non regredita del piano.Mitigation can include reverting the compatibility level or using Query Store to force the non-regressed version of the plan.

Esecuzione interleaved ed esecuzioni consecutiveInterleaved execution and consecutive executions

Dopo che un piano di esecuzione interleaved viene memorizzato nella cache, il piano con le stime aggiornate alla prima esecuzione viene usato per le esecuzioni consecutive e non viene creata di nuovo l'istanza di esecuzione interleaved.Once an interleaved execution plan is cached, the plan with the revised estimates on the first execution is used for consecutive executions without re-instantiating interleaved execution.

Rilevamento delle attività di esecuzione interleavedTracking interleaved execution activity

È possibile visualizzare gli attributi d'uso nel piano di esecuzione query:You can see usage attributes in the actual query execution plan:

Attributo del pianoPlan attribute DescriptionDescription
ContainsInterleavedExecutionCandidatesContainsInterleavedExecutionCandidates Valido per il nodo QueryPlan. Se è "true" il piano contiene candidati per l'esecuzione interleaved.Applying to the QueryPlan node, when “true”, it means the plan contains interleaved execution candidates.
IsInterleavedExecutedIsInterleavedExecuted L'attributo è all'interno dell'elemento RuntimeInformation sotto il RelOp del nodo TVF.The attribute is inside the RuntimeInformation element under the RelOp for the TVF node. Se è "true" l'operazione è stata materializzata come parte di un'operazione di esecuzione interleaved.When “true”, it means the operation was materialized as part of an interleaved execution operation.

È anche possibile rilevare le occorrenze di esecuzione interleaved con i seguenti eventi XEvent:You can also track interleaved execution occurrences via the following XEvents:

XEventXEvent DescriptionDescription
interleaved_exec_statusinterleaved_exec_status Questo evento viene generato quando si verifica l'esecuzione interleaved.This event fires when interleaved execution is occurring.
interleaved_exec_stats_updateinterleaved_exec_stats_update Questo evento descrive le stime della cardinalità aggiornate dall'esecuzione interleaved.This event describes the cardinality estimates updated by interleaved execution.
Interleaved_exec_disabled_reasonInterleaved_exec_disabled_reason Questo evento viene generato quando in una query con un possibile candidato per l'esecuzione interleaved non viene applicata tale modalità di esecuzione.This event fires when a query with a possible candidate for interleaved execution does not actually get interleaved execution.

Per consentire all'esecuzione interleaved di rivedere le stime della cardinalità MSTVF è necessario eseguire la query.A query must be executed in order to allow interleaved execution to revise MSTVF cardinality estimates. Tuttavia il piano di esecuzione viene ancora visualizzato quando sono presenti candidati per l'esecuzione interleaved tramite l'attributo ContainsInterleavedExecutionCandidates.However, the estimated execution plan still shows when there are interleaved execution candidates via the ContainsInterleavedExecutionCandidates attribute.

Memorizzazione nella cache dell'esecuzione interleavedInterleaved execution caching

Se un piano è viene cancellato o espulso dalla cache, durante l'esecuzione della query l'esecuzione interleave viene usata da una nuova compilazione.If a plan is cleared or evicted from cache, upon query execution there is a fresh compilation that uses interleaved execution. Un'istruzione che usa OPTION(RECOMPILE) crea un nuovo piano usando l'esecuzione interleaved e non lo memorizza nella cache.A statement using OPTION(RECOMPILE) will create a new plan using interleaved execution and not cache it.

Interoperabilità tra esecuzione interleaved e Archivio queryInterleaved execution and query store interoperability

È possibile forzare i piani che usano l'esecuzione interleaved.Plans using interleaved execution can be forced. Il piano è la versione che presenta stime della cardinalità corrette sulla base dell'esecuzione iniziale.The plan is the version that has corrected cardinality estimates based on initial execution.

Vedere ancheSee Also

Centro prestazioni per il motore di database di SQL Server e il database SQL di AzurePerformance Center for SQL Server Database Engine and Azure SQL Database

Demonstrating Adaptive Query ProcessingDemonstrating Adaptive Query Processing (Dimostrazione dell'elaborazione di query adattive)