Share via


Guida di riferimento agli operatori logici e fisici

Gli operatori descrivono la modalità di esecuzione di una query o di un'istruzione del linguaggio di manipolazione dei dati (DML, Data Manipulation Language) in SQL Server. In Query Optimizer gli operatori consentono di definire un piano di query per ottenere i risultati specificati nella query o per eseguire l'operazione specificata nell'istruzione DML. Il piano di query è un albero composto da operatori fisici.

Gli operatori sono suddivisi in operatori logici e fisici. Gli operatori logici descrivono un'operazione di elaborazione di query relazionale a livello concettuale. Gli operatori fisici implementano l'operazione definita da un operatore logico tramite un metodo o algoritmo concreto. Ad esempio, "join" è un'operazione logica mentre "nested loops join" è un operatore fisico.

  • Operatori logici
    Gli operatori logici descrivono l'operazione algebrica relazionale utilizzata per elaborare un'istruzione, ovvero descrivono a livello concettuale quale operazione deve essere eseguita.

  • Operatori fisici
    Gli operatori fisici implementano l'operazione descritta dagli operatori logici. Ogni operatore fisico è un oggetto o una routine che esegue un'operazione. Alcuni operatori fisici, ad esempio, accedono alle colonne o alle righe di una tabella, di un indice o di una vista. Altri eseguono operazioni di tipo diverso: l'operatore Aggregate calcola il valore di un'espressione che include MIN, MAX, SUM, COUNT o AVG, mentre l'operatore Merge Join esegue diversi tipi di operazioni di join.

    Dopo essere stati inizializzati, gli operatori fisici raccolgono dati e quindi vengono chiusi. Un operatore fisico risponde alle tre chiamate di metodo seguenti:

    • Init(): con la chiamata del metodo Init() un operatore fisico si autonoinizializza e imposta le strutture di dati necessarie. Sebbene l'operatore fisico possa ricevere molte chiamate Init(), in genere ne riceve una sola.

    • GetNext(): con la chiamata del metodo GetNext() un operatore fisico recupera la prima riga di dati oppure la successiva. L'operatore fisico può ricevere più chiamate GetNext() oppure nessuna.

    • Close(): con la chiamata del metodo Close() un operatore fisico esegue alcune operazioni di eliminazione e viene quindi chiuso automaticamente. Un operatore fisico riceve una sola chiamata del metodo Close().

Il metodo GetNext() restituisce una riga di dati e il numero di chiamate ricevute viene visualizzato come ActualRows nell'output Showplan generato utilizzando SET STATISTICS PROFILE ON o SET STATISTICS XML ON. Per ulteriori informazioni su queste opzioni SET, vedere SET STATISTICS PROFILE (Transact-SQL) e SET STATISTICS XML (Transact-SQL).

I conteggi ActualRebinds e ActualRewinds visualizzati nell'output Showplan fanno riferimento al numero di chiamate al metodo Init(). A meno che un operatore non sia nel lato interno di un join ciclico, ActualRebinds è uguale a uno e ActualRewinds è uguale a zero. Se un operatore si trova nel lato interno di un join ciclico, la somma del numero delle associazioni e dei ripristini dovrebbe essere pari al numero delle righe elaborate nel lato esterno del join. Una riassociazione significa che uno o più parametri correlati del join sono stati modificati e che è necessario rivalutare il lato interno. Un ripristino significa che nessuno dei parametri correlati è stato modificato e che è possibile riutilizzare il set di risultati interno precedente.

ActualRebinds e ActualRewinds sono inclusi nell'output Showplan XML generato utilizzando SET STATISTICS XML ON. Vengono popolati esclusivamente per gli operatori Nonclustered Index Spool, Remote Query, Row Count Spool, Sort, Table Spool e Table-valued Function. Anche ActualRebinds e ActualRewinds possono essere popolati per gli operatori Assert e Filter quando l'attributo StartupExpression è impostato su TRUE.

Quando ActualRebinds e ActualRewinds sono inclusi in uno Showplan XML, sono confrontabili con EstimateRebinds e EstimateRewinds. Quando non sono presenti, il numero di righe stimato (EstimateRows) è confrontabile con il numero effettivo di righe (ActualRows). Si noti che nell'output Showplan grafico effettivo è visualizzato zero per le riassociazioni e i ripristini effettivi quando non presenti. Per ulteriori informazioni sugli Showplan grafici, vedere Visualizzazione dei piani di esecuzione grafici (SQL Server Management Studio).

Un contatore correlato, ActualEndOfScans, è disponibile solo quando l'output Showplan viene generato utilizzando SET STATISTICS XML ON. Ogni volta che un operatore fisico raggiunge la fine del proprio flusso di dati, il contatore viene incrementato di uno. Un operatore fisico può raggiungere la fine del proprio flusso di dati, zero, una o più volte. Come per riassociazioni e ripristini, il numero delle scansioni terminate può essere maggiore di uno se l'operatore si trova nel lato interno di un join ciclico. Il numero di scansioni terminate dovrebbe essere minore o uguale alla somma del numero di riassociazioni e ripristini.

Gli operatori fisici corrispondono ad algoritmi di esecuzione. Sono esempi di operatori fisici index scan/seek, nested loop join, merge join, hash join/aggregation, stream aggregation. Gli operatori fisici possono influire sulle prestazioni. In ogni passaggio dell'esecuzione di una query o di un'istruzione DML infatti viene utilizzato un operatore fisico.

Mapping di operatori logici e fisici

In Query Optimizer viene creato un piano di query che consiste in un albero di operatori logici. Dopo la creazione del piano, viene scelto l'operatore fisico più efficiente per ogni operatore logico. L'operatore fisico che implementerà un operatore logico viene individuato in base al costo.

In genere un'operazione logica può essere implementata da più operatori fisici. In alcuni casi rari tuttavia anche un operatore fisico può implementare più operazioni logiche.

Contenuto della sezione

In questa sezione vengono illustrati gli operatori fisici seguenti:

Aggregate

Merge Interval

Arithmetic Expression

Merge Join

Assert

Nested Loops

Assign

Nonclustered Index Delete

Async Concat

Nonclustered Index Insert

Bitmap

Nonclustered Index Scan

Bitmap Create

Nonclustered Index Seek

Bookmark Lookup

Nonclustered Index Spool

Branch Repartition

Nonclustered Index Update

Broadcast

Online Index Insert

Cache

Parallelism

Clustered Index Delete

Parameter Table Scan

Clustered Index Insert

Partial Aggregate

Unione indice cluster

Population Query

Clustered Index Scan

Refresh Query

Clustered Index Seek

Remote Delete

Clustered Index Update

Remote Index Scan

Collapse

Remote Index Seek

Compute Scalar

Remote Insert

Concatenation

Remote Query

Constant Scan

Remote Scan

Convert

Remote Update

Cross Join

Repartition Streams

Cursor Catchall

Result

Declare

RID Lookup

Delete

Right Anti Semi Join

Deleted Scan

Right Outer Join

Distinct

Right Semi Join

Distinct Sort

Row Count Spool

Distribute Streams

Segment

Dynamic

Segment Repartition

Eager Spool

Sequence

Fetch Query

SequenceProject

Filter

Snapshot

Flow Distinct

Sort

Full Outer Join

Split

Gather Streams

Spool

Hash Match

Stream Aggregate

Hash Match Root

Switch

Hash Match Team

Table Delete

If

Table Insert

Inner Join

Unione tabella

Insert

Table Scan

Inserted Scan

Table Spool

Intrinsic

Table Update

Iterator Catchall

Table-Valued Function

Key Lookup

Top

Keyset

Top N Sort

Language Element Catchall

UDX

Lazy Spool

Union

Left Anti Semi Join

Update

Left Outer Join

While

Left Semi Join

Operatori logici e fisici Cursor

Log Row Scan