Compartilhar via


Referência de operadores lógicos e físicos

Os operadores descrevem como o SQL Server executa uma consulta ou uma instrução DML (Linguagem de Manipulação de Dados). O otimizador de consultas usa os operadores para criar um plano de consulta a fim de criar o resultado especificado na consulta ou para executar a operação especificada na instrução DML. O plano de consulta é uma árvore que consiste em operadores físicos.

Os operadores são classificados como lógicos e físicos. Os operadores lógicos descrevem uma consulta relacional que processa uma operação em um nível conceitual. Os operadores físicos, na verdade, implementam a operação definida por um operador lógico usando um método concreto ou algoritmo. Por exemplo, "junção" é uma operação lógica, ao passo que "junção de loops aninhados" é um operador físico.

  • Operadores lógicos
    Os operadores lógicos descrevem a operação algébrica relacional usada para processar uma instrução. Em outras palavras, operadores lógicos descrevem conceitualmente qual operação precisa ser executada.

  • Operadores físicos
    Os operadores físicos implementam a operação descrita pelos operadores lógicos. Cada operador físico é um objeto ou uma rotina que executa uma operação. Por exemplo, alguns operadores físicos acessam colunas ou linhas de uma tabela, índice ou exibição. Outros executam outros tipos de operações: o operador Aggregate calcula uma expressão que contém MIN, MAX, SUM, COUNT ou AVG e o operador Merge Join executa diferentes tipos de operações de junção lógicas.

    Os operadores físicos iniciam, coletam dados e fecham. Especificamente, o operador físico pode responder às três chamadas de método abaixo:

    • Init(): o método Init() faz com que um operador físico se inicialize e define quaisquer estruturas de dados necessárias. O operador físico pode receber muitas chamadas Init(), entretanto, um operador físico costuma receber somente uma.

    • GetNext(): o método GetNext() faz um operador físico adquirir a primeira linha de dados ou a subseqüente. O operador físico pode receber zero ou muitas chamadas GetNext().

    • Close(): o método Close() faz um operador físico executar algumas operações de limpeza total e se desligar. Um operador físico só recebe uma chamada Close().

O método GetNext () retorna uma linha de dados e o número de vezes em que é chamado aparece como ActualRows na saída do Plano de Execução que é produzida usando as opções SET STATISTICS PROFILE ON ou SET STATISTICS XML ON. Para obter mais informações sobre essas opções SET, consulte SET STATISTICS PROFILE (Transact-SQL) e SET STATISTICS XML (Transact-SQL).

Os contadores ActualRebinds e ActualRewinds exibidos na saída do Plano de Execução referem-se ao número de vezes que o método Init() é chamado. A menos que um operador esteja no lado interno de uma junção de loop, ActualRebinds será igual a um e ActualRewinds será igual a zero. Se um operador estiver no lado interno de uma junção de loop, a soma do número de reassociações e retrocessos deve ser igual ao número de linhas processadas no lado externo da junção. Uma reassociação significa que um ou mais dos parâmetros correlatos da junção se alterou e o lado interno deve ser reavaliado. Um retrocesso significa que nenhum dos parâmetros correlatos se alterou e o conjunto de resultados interno anterior pode ser usado novamente.

ActualRebinds e ActualRewinds estão presentes na saída do Plano de Execução XML produzida usando a opção SET STATISTICS XML ON. Eles só são populados para os operadores Nonclustered Index Spool, Remote Query, Row Count Spool, Sort, Table Spool e Table-valued Function. ActualRebinds e ActualRewinds também podem ser populados para os operadores Assert e Filter quando o atributo StartupExpression é definido como TRUE.

Quando ActualRebinds e ActualRewinds estiverem presentes em um Plano de Execução XML, serão comparáveis a EstimateRebinds e EstimateRewinds. Quando estiverem ausentes, o número estimado de linhas (EstimateRows) será comparável ao número de linhas real (ActualRows). Observe que a saída gráfica real do Plano de Execução exibe zeros para reassociações e retrocessos reais quando eles estão ausentes. Para obter mais informações sobre Planos de execução gráficos, consulte Exibindo planos de execução gráfica (SQL Server Management Studio).

Um contador relacionado, ActualEndOfScans, só está disponível quando a saída do Plano de Execução é produzida usando a opção SET STATISTICS XML ON. Sempre que um operador físico chega ao término de seu fluxo de dados, esse contador é incrementado em um. Um operador físico pode chegar ao término de seu fluxo de dados zero, uma ou mais vezes. Como com as reassociações e os retrocessos, o número de término de exames só poderá ser superior a um se o operador estiver no lado interno de uma junção de loop. O número de término de exames deveria ser inferior ou igual à soma do número de reassociações e retrocessos.

Os operadores físicos correspondem a algoritmos de execução. Exemplos de operadores físicos incluem exame/busca de índice, junção de loop aninhado, junção de mesclagem, junção/agregação de hash, agregação de fluxo. Os operadores físicos possuem custos associados. Cada etapa na execução de uma consulta ou instrução DML envolve um operador físico.

Mapeando operadores físicos e lógicos

O otimizador de consulta cria um plano de consulta como uma árvore que consiste em operadores lógicos. Depois de criar o plano, o otimizador de consulta escolhe o operador físico mais eficiente para cada operador lógico. O otimizador de consulta usa uma abordagem baseada em custos para determinar qual operador físico implementará um operador lógico.

Normalmente, uma operação lógica pode ser implementada por diversos operadores físicos. Em alguns casos raros, porém, um operador físico também pode implementar diversas operações lógicas.

Nesta seção

Esta seção contém descrições dos seguintes operadores lógicos e físicos:

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

Clustered Index Merge

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

Table Merge

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

Cursor Logical and Physical Operators

Log Row Scan