Referência de operadores físicos e lógicos de plano de execução
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. Você pode exibir o plano de consulta usando as instruções SET SHOWPLAN, as opções de plano de execução gráfica no SQL Server Management Studio ou as classes de evento do Plano de Execução do SQL Server Profiler.
Os operadores são classificados como lógicos e físicos.
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 operadores físicos executam outras operações como cálculos, agregações, verificações da integridade de dados ou junções. Os operadores físicos possuem custos associados.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 subsequente. 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.
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.
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.
Descrições dos operadores
Esta seção contém descrições dos operadores lógicos e físicos.
Ícone do plano de execução gráfica |
Operador de plano de execução |
Descrição |
||
---|---|---|---|---|
Nenhum |
Aggregate |
O operador Aggregate calcula uma expressão que contém MIN, MAX, SUM, COUNT ou AVG. O operador Aggregate pode ser um operador lógico ou um operador físico. |
||
Arithmetic Expression |
O operador Arithmetic Expression computa um valor novo de valores existentes em uma linha. Arithmetic Expression não é usado no SQL Server 2012. |
|||
Assert |
O operador Assert verifica uma condição. Por exemplo, ele valida integridade referencial ou assegura que uma subconsulta escalar retorne uma linha. Para cada linha de entrada, o operador Assert avalia a expressão na coluna Argumento do plano de execução. Se essa expressão for avaliada como NULL, a linha será passada pelo operador Assert e a execução de consulta continuará. Se essa expressão for avaliada como um valor não nulo, será gerado um erro apropriado. O operador Assert é um operador físico. |
|||
Assign |
O operador Assign atribui o valor de uma expressão ou constante a um variável. Assign é um elemento de linguagem. |
|||
Nenhum |
Asnyc Concat |
O operador Asnyc Concat é usado somente em consultas remotas (consultas distribuídas). Ele tem n filhos e um nó pai. Normalmente, alguns dos filhos são computadores remotos que participam de uma consulta distribuída. Asnyc Concat emite chamadas open() simultaneamente a todos os filhos e aplica um bitmap a cada filho. Para cada bit que é um 1, Async Concat envia linhas de saída para o nó pai sob demanda. |
||
Bitmap |
O SQL Server usa o operador Bitmap para implementar filtro de bitmap em planos de consulta paralelos. O filtro de bitmap acelera a execução de consulta eliminando linhas com valores de chave que não podem produzir nenhum relatório de junção antes de transmitir as linhas por outro operador como o operador Parallelism. Um filtro de bitmap usa uma representação compacta de um conjunto de valores de uma tabela em uma parte da árvore de operador de uma segunda tabela em outra parte da árvore. Removendo linhas desnecessárias no início na consulta, os operadores subsequentes têm menos linhas para processar e o desempenho geral da consulta melhora. O otimizador determina quando um bitmap é seletivo o suficiente para ser útil e em qual os operadores aplicar o filtro. Bitmap é um operador físico. |
|||
Bitmap Create |
O operador Bitmap Create aparece na saída do plano de execução onde os bitmaps são criados.. Bitmap Create é um operador lógico. |
|||
Bookmark Lookup |
O operador Bookmark Lookup usa um indicador (ID da fila ou chave de clustering) para pesquisar a linha correspondente na tabela ou índice clusterizado. A coluna Argument contém o rótulo do indicador usado para procurar a linha na tabela ou índice clusterizado. A coluna Argument também contém o nome da tabela ou índice clusterizado no qual a linha é procurada. Se a cláusula WITH PREFETCH aparecer na coluna Argument, o processador de consulta determinará que convém usar a pré-busca assíncrona (read-ahead) ao procurar indicadores na tabela ou índice clusterizado. Bookmark Lookup não é usado no SQL Server 2012. Em vez disso, Clustered Index Seek e RID Lookup fornecem funcionalidade de indicador de pesquisa. O operador Key Lookup também fornece essa funcionalidade. |
|||
Nenhum |
Branch Repartition |
Às vezes, em um plano de consulta paralelo, há regiões conceituais de iteradores. Todos os iteradores dentro de tal região podem ser executados por threads paralelos. As próprias regiões devem ser executadas em série. Alguns dos iteradores Parallelism em uma região individual são chamados Branch Repartition. O iterador Parallelism no limite dessas duas regiões é chamado Segment Repartition. Branch Repartition e Segment Repartition são operadores lógicos. |
||
Nenhum |
Broadcast |
Broadcast tem um nó filho e nós pai n. Broadcast envia suas linhas de entrada para vários consumidores sob demanda. Cada consumidor adquire todas as linhas. Por exemplo, se todos os consumidores representarem lados de criação de uma junção hash, cópias n das tabelas de hash serão criadas. |
||
Build Hash |
Indica a criação de uma tabela de hash de lote para um índice columnstore xVelocity de memória otimizada. |
|||
Nenhum. |
Cache |
O Cache é uma versão especializada do operador Spool. Ele armazena somente uma linha de dados. O Cache é um operador lógico. O Cache não é usado no SQL Server 2012. |
||
Clustered Index Delete |
O operador Clustered Index Delete exclui linhas do índice clusterizado especificado na coluna Argument do plano de execução de consulta. Se um predicado WHERE: () estiver presente na coluna Argument, somente as linhas que atenderem ao predicado serão excluídas. Clustered Index Delete é um operador físico. |
|||
Clustered Index Insert |
O operador Showplan Clustered Index Insert insere linhas de sua entrada no índice clusterizado especificado na coluna Argument. A coluna Argument também contém um predicado SET:(), que indica o valor para o qual cada coluna está definida. Se Clustered Index Insert não tiver nenhum filho para valores de inserção, a linha inserida será extraída do próprio operador Insert.Clustered Index Insert é um operador físico. |
|||
Clustered Index Merge |
O operador Clustered Index Merge aplica um fluxo de mesclagem de dados a um índice clusterizado. O operador exclui, atualiza ou insere linhas do índice clusterizado especificado na coluna Argument do operador. A operação real executada depende do valor de tempo de execução da coluna ACTION especificada na coluna Argument do operador. Clustered Index Merge é um operador físico. |
|||
Clustered Index Scan |
O operador Clustered Index Scan examina o índice clusterizado especificado na coluna Argument do plano de execução da consulta. Quando houver um predicado opcional WHERE:(), somente as linhas que atenderem ao predicado serão retornadas. Se a coluna Argument apresentar a cláusula ORDERED, o processador de consulta terá solicitado que a saída das linhas seja retornada na ordem em que o índice clusterizado as classificou. Se a cláusula ORDERED não estiver presente, o mecanismo de armazenamento examinará o índice em modo ótimo, sem necessariamente classificar a saída. Clustered Index Scan é um operador lógico e físico. |
|||
Clustered Index Seek |
O operador Clustered Index Seek usa a habilidade de busca de índices para recuperar linhas de um índice cluster. A coluna Argumento contém o nome do índice clusterizado que está sendo usado e o predicado SEEK:(). O mecanismo de armazenamento usa o índice para processar somente as linhas que satisfazem esse predicado SEEK:(). Ele pode incluir também um predicado WHERE:(), onde o mecanismo de armazenamento avaliará em relação a todas as linhas que satisfizerem o predicado SEEK:(), mas isso é opcional e não usa índices para executar esse processo. Se a coluna Argumento contiver a cláusula ORDERED, o processador de consulta determinou que as linhas fossem retornadas na ordem em que o índice clusterizado as classificou. Se a cláusula ORDERED não estiver presente, o mecanismo de armazenamento pesquisará o índice em modo ótimo, sem necessariamente classificar a saída. Permitir que a saída retenha sua ordenação pode ser menos eficiente do que produzir saída não classificada. Quando a palavra-chave LOOKUP aparecer, então uma consulta de marcador está sendo executada. No SQL Server 2008 e em versões posteriores, o operador Key Lookup fornece a funcionalidade de consulta de marcador. Clustered Index Seek é um operador lógico e físico. |
|||
Clustered Index Update |
O operador Clustered Index Update atualiza as linhas de entrada no índice clusterizado especificado na coluna Argument. Se um predicado WHERE:() estiver presente, somente as linhas que satisfazem esse predicado serão atualizadas. Se um predicado SET: () está presente, cada coluna atualizada é definida para esse valor. Se um predicado DEFINE: () está presente, serão listados os valores que esse operador definir. Esses valores podem ser referenciados na cláusula SET ou em outro lugar dentro desse operador e em outro lugar dentro dessa consulta. Clustered Index Update é um operador lógico e físico. |
|||
Collapse |
O operador Collapse otimiza processamento de atualização. Quando uma atualização é executada, ela pode ser dividida (usando o operador Split) em uma exclusão e uma entrada. A coluna Argument contém uma cláusula GROUP BY: () que especifica uma lista de colunas de chave. Se o processador de consultas encontrar linhas adjacentes que incluem e inserem os mesmos valores de chave, ele substituirá essas operações separadas por uma operação de atualização única e mais eficiente. Collapse é um operador lógico e físico. |
|||
Columnstore Index Scan |
O operador Columnstore Index Scan examina o índice columnstore especificado na coluna Argument do plano de execução da consulta. |
|||
Compute Scalar |
O operador Compute Scalar avalia uma expressão para produzir um valor escalar computado. Isso pode ser retornado ao usuário, ter referência em outro lugar na consulta, ou ambos. Um exemplo de ambos está em um predicado de filtro ou predicado de junção. O Compute Scalar é um operador lógico e físico. Operadores Compute Escalar que aparecem em planos de execução gerados por SET STATISTICS XML podem não conter o elemento RunTimeInformation . Em planos de execução gráficos, Linhas Reais, Religações Reaise Retrocessos Reais podem estar ausentes na janela Propriedades quando a opção Incluir Plano de Execução Real estiver selecionada em SQL Server Management Studio. Quando isto acontece, significa que, embora os operadores tenham sido usados no plano de consulta compilado, o trabalho foi executado por outros operadores no plano de consulta de tempo de execução. Observe também que o número de execuções na saída de plano de execução gerada por SET STATISTICS PROFILE é equivalente à soma de reassociações e retrocessos em planos de execução gerados por SET STATISTICS XML. |
|||
Concatenation |
O operador Concatenation verifica várias entradas, retornando cada linha verificada. Concatenation normalmente é usado para implementar a construção UNION ALL Transact-SQL. O operador físico Concatenation tem duas ou mais entradas e uma saída. Concatenation copia linhas do primeiro fluxo de entrada ao fluxo de saída e repete essa operação para cada fluxo de entrada adicional. Concatenation é um operador lógico e físico. |
|||
Constant Scan |
O operador Constant Scan introduz uma ou mais linhas constantes em uma consulta. Um operador Compute Scalar é frequentemente usado após uma Constant Scan para acrescentar colunas a uma linha produzida pelo operador Constant Scan. |
|||
Convert |
O operador Convert converte um tipo de dados escalar em outro. Convert é um elemento de linguagem. |
|||
Nenhum |
Cross Join |
O operador Cross Join une cada linha da primeira entrada (superior) a cada linha da segunda entrada (inferior). Cross Join é um operador lógico. |
||
catchall |
O ícone catchall é exibido quando a lógica que produz planos de execução gráficos não puder encontrar um ícone viável para o iterador. O ícone catchall não indica necessariamente uma condição de erro. Há três ícones catchall: azul (para iteradores), laranja (para cursores) e verde (para elementos de linguagem Transact-SQL). |
|||
Nenhum |
Cursor |
Os operadores lógicos e físicos Cursor são usados para descrever como é executada uma consulta ou atualização que envolva operações de cursor. Os operadores físicos descrevem o algoritmo de implementação físico usado para processar o cursor; por exemplo, usando um cursor controlado por conjunto de chaves. Cada etapa na execução de um cursor envolve um operador físico. Os operadores lógicos descrevem uma propriedade do cursor, como quando o cursor é somente leitura. Operadores lógicos incluem Asynchronous, Optimistic, Primary, Read Only, Scroll Locks, Secondary e Synchronous. Operadores físicos incluem Dynamic, Fetch Query, Keyset, Population Query, Refresh Query e Snapshot. |
||
Declare |
O operador Declare aloca uma variável local no plano de consulta. Declare é um elemento de linguagem. |
|||
Delete |
O operador Delete efetua a exclusão em linhas de objeto que atendem ao predicado opcional na coluna Argumento. |
|||
Deleted Scan |
O operador Deleted Scan examina a tabela excluída em um gatilho. |
|||
Nenhum |
Distinct |
O operador Distinct remove duplicatas de um conjunto de linhas ou de uma coleção de valores. Distinct é um operador lógico. |
||
Nenhum |
Distinct Sort |
O operador lógico Distinct Sort verifica a entrada, removendo duplicatas e fazendo classificação pelas colunas especificadas no predicado DISTINCT ORDER BY: () da coluna Argument. Distinct Sort é um operador lógico. |
||
Distribute Streams |
O operador Distribute Streams só é usado em planos de consulta paralelos. O operador Distribute Streams leva um fluxo de entrada simples de registros e produz fluxos de saída múltiplos. O conteúdo do registro e o formato não são alterados. Cada registro do fluxo de entrada aparece em um dos fluxos de saída. Este operador preserva automaticamente a ordem relativa dos registros de entrada nos fluxos de saída. Normalmente, são usadas operações de hash para decidir a qual fluxo de saída pertence um determinado registro de entrada. Se a saída for particionada, então a coluna Argument conterá um predicado PARTITION COLUMNS: () e as colunas de particionamento. Distribute Streams é um operador lógico |
|||
Dynamic |
O operador Dynamic usa um cursor que pode ver todas as alterações feitas por outros. |
|||
Eager Spool |
O operador Eager Spool pega toda a entrada, armazenando cada linha em um objeto temporário oculto armazenado no banco de dados tempdb. Se for feito o retrocesso do operador (por exemplo, por um operador Nested Loops) sem que haja necessidade de reassociação, serão usados os dados em spool em vez de um novo exame da entrada. Se a reassociação for necessária, os dados em spool serão descartados e o objeto de spool será recriado por meio do novo exame da entrada (religação). O operador Eager Spool cria seu arquivo de spool de maneira “ávida”, ou seja, cada vez que o operador pai do spool solicita a primeira linha, o operador de spool consome todas as linhas de seu operador de entrada e as armazena no spool. O Eager Spool é um operador lógico. |
|||
Fetch Query |
O operador Fetch Query recupera linhas quando é feita uma busca em um cursor. |
|||
Filter |
O operador Filter examina a entrada, retornando apenas as linhas que satisfazem a expressão de filtro (predicado) que aparece na coluna Argument. |
|||
Nenhum |
Flow Distinct |
O operador lógico Flow Distinct examina a entrada, removendo duplicatas. Enquanto o operador Distinct consome toda a entrada antes de produzir qualquer saída, o operador FlowDistinct retorna cada linha como foi obtida da entrada (a menos que a fila seja uma duplicata: nesse caso ela é descartada). |
||
Nenhum |
Full Outer Join |
O operador lógico Full Outer Join retorna cada linha que satisfaz o predicado de junção da primeira entrada (parte superior) associada a cada linha da segunda entrada (parte inferior). Ele também retorna linhas:
A entrada que não contém os valores correspondentes é retornada como um valor nulo. Full Outer Join é um operador lógico. |
||
Gather Streams |
O operador Gather Streams só é usado em planos de consulta paralelos. O operador Gather Streams consome vários fluxos de entrada e produz um único fluxo de saída de registros ao combinar os fluxos de entrada. O conteúdo do registro e o formato não são alterados. Se este operador for preservador da ordem, todos os fluxos de entrada deverão ser ordenados. Se a saída for ordenada, a coluna Argument conterá um predicado ORDER BY:() e os nomes das colunas que estão sendo ordenadas. Gather Streams é um operador lógico. |
|||
Hash Match |
O operador Hash Match cria uma tabela de hash computando um valor de hash para cada linha da entrada criada. Um predicado HASH: () com uma lista de colunas usadas para criar um valor de hash aparece na coluna Argumento. Então, para cada fila de sondagem (conforme aplicável), ela computa um valor de hash (usando a mesma função de hash) e procura correspondências na tabela de hash. Se um predicado residual estiver presente (identificado por RESIDUAL: () na coluna Argumento ), esse predicado também deverá ser atendido para que as linhas sejam consideradas uma correspondência. O comportamento depende da operação lógica que está sendo executada:
Hash Match é um operador físico. |
|||
If |
O operador If executa processamento condicional com base em uma expressão. If é um elemento de linguagem. |
|||
Nenhum |
Inner Join |
O operador lógico Inner Join retorna cada linha que satisfaz a junção da primeira entrada (superior) com a segunda entrada (inferior). |
||
Insert |
O operador lógico Insert insere cada linha de sua entrada no objeto especificado na coluna Argument. O operador físico é o operador Table Insert, Index Insert ou Clustered Index Insert. |
|||
Inserted Scan |
O operador Inserted Scan verifica a tabela inserida. O Inserted Scan é um operador lógico e físico. |
|||
Intrinsic |
O operador Intrinsic invoca uma função Transact-SQL interna. Intrinsic é um elemento de linguagem. |
|||
Iterator |
O ícone catchall Iterator é exibido quando um ícone adequado para o iterador não é encontrado pela lógica que produz planos de execução gráfica. O ícone catchall não indica necessariamente uma condição de erro. Há três ícones catchall: azul (para iteradores), laranja (para cursores) e verde (para construções de linguagem do Transact-SQL). |
|||
Key Lookup |
O operador Key Lookup é uma pesquisa de indicadores em uma tabela com um índice clusterizado. A coluna Argumento contém o nome do índice clusterizado e a chave de clusterização usada para procurar a linha no índice clusterizado. Key Lookup é sempre acompanhada por um operador Loops. Se a cláusula WITH PREFETCH aparecer na coluna Argument, o processador de consultas determinará que convém usar pré-busca assíncrona (read-ahead) ao observar marcadores no índice clusterizado. O uso de um operador Key Lookup em um plano de consulta indica que a consulta pode se beneficiar de ajuste de desempenho. Por exemplo, o desempenho da consulta pode ser melhorado adicionando-se um índice de cobertura. |
|||
Keyset |
O operador Keyset usa um cursor que pode visualizar atualizações, mas não inserções feitas por outros. |
|||
Language Element |
O ícone catchall Language Element é exibido quando um ícone adequado para o iterador não é encontrado pela lógica que produz planos de execução gráfica. O ícone catchall não indica necessariamente uma condição de erro. Há três ícones catchall: azul (para iteradores), laranja (para cursores) e verde (para construções de linguagem do Transact-SQL). |
|||
Lazy Spool |
O operador lógico Lazy Spool armazena cada linha de sua entrada em um objeto temporário oculto armazenado no banco de dados tempdb. Se for feito o retrocesso do operador (por exemplo, por um operador Nested Loops) sem que haja necessidade de reassociação, serão usados os dados em spool em vez de um novo exame da entrada. Se a reassociação for necessária, os dados em spool serão descartados e o objeto de spool será recriado por meio do novo exame da entrada (religação). O operador Lazy Spool cria seu arquivo de spool de maneira “lenta”, ou seja, sempre que o operador pai do spool solicita uma linha, o operador do spool obtém uma linha de seu operador de entrada e a armazena no spool, em vez de consumir todas as linhas de uma vez. O Lazy Spool é um operador lógico. |
|||
Nenhum |
Left Anti Semi Join |
O operador Left Anti Semi Join retorna cada linha da primeira entrada (parte superior) quando não existe uma linha correspondente na segunda entrada (parte inferior). Se não houver nenhum predicado de junção na coluna Argument, cada linha será uma linha correspondente. Left Anti Semi Join é um operador lógico. |
||
Nenhum |
Left Outer Join |
O operador Left Outer Join retorna cada linha que satisfaz a junção da primeira entrada (parte superior) com a segunda entrada (parte inferior). Ele também retorna linhas da primeira entrada que não teve linhas correspondentes na segunda entrada. As linhas não correspondentes na segunda entrada são retornadas como valores nulos. Se não houver nenhum predicado de junção na coluna Argument, cada linha será uma linha correspondente. Left Outer Join é um operador lógico. |
||
Nenhum |
Left Semi Join |
O operador Left Semi Join retorna cada linha da primeira entrada (parte superior) quando existe uma linha correspondente na segunda entrada (parte inferior). Se não houver nenhum predicado de junção na coluna Argument, cada linha será uma linha correspondente. Left Semi Join é um operador lógico. |
||
Log Row Scan |
O operador Log Row Scan examina o log de transações. Log Row Scan é um operador lógico e físico. |
|||
Merge Interval |
O operador Merge Interval mescla vários intervalos (com sobreposição potencial) para produzir intervalos mínimo, não sobrepostos, usados para buscar entradas de índice. Esse operador aparece geralmente sobre um ou mais operadores Compute Scalar sobre operadores Constant Scan, que constroem os intervalos (representados como colunas em uma linha) que esse operador mescla. Merge Interval é um operador lógico e físico. |
|||
Merge Join |
O operador Merge Join executa a inner join, left outer join, left semi join, left anti semi join, right outer join, right semi join, right anti semi join e operações lógicas de união. Na coluna Argumento, o operador Merge Join contém um predicado MERGE: () se a operação estiver executando uma junção de um para muitos, ou um predicado MANY-TO-MANY MERGE: () se a operação estiver executando uma junção de muitos para muitos. A coluna Argumento também inclui uma lista de colunas separada por vírgulas usada para executar a operação. O operador Merge Join requer duas entradas classificadas em suas respectivas colunas, possivelmente inserindo operações de classificação explícitas no plano de consulta. A junção de mesclagem é particularmente eficaz se não for exigida uma classificação explícita, por exemplo, se houver um índice da árvore B adequado no banco de dados, ou se a ordem de classificação puder ser explorada para diversas operações, como uma junção de mesclagem e um agrupamento com acúmulo. Merge Join é um operador físico. |
|||
Nested Loops |
O operador Nested Loops executa operações lógicas de junção interna, junção externa esquerda, left semi join e left anti semi join. As junções de loops aninhados executam uma pesquisa na tabela interna para cada linha da tabela exterior, normalmente usando um índice. O processador de consultas decide, com base em custos antecipados, se deve classificar a entrada exterior para aprimorar a localidade das pesquisas no índice da entrada interna. Qualquer linha que satisfaça o predicado (opcional) na coluna Argument é retornada como aplicável, com base na operação lógica em execução. Nested Loops é um operador físico. |
|||
Nonclustered Index Delete |
O operador Nonclustered Index Delete exclui linhas de entrada do índice não cluster especificado na coluna Argument. Nonclustered Index Delete é um operador físico. |
|||
Index Insert |
O operador Index Insert insere linhas de sua entrada no índice não clusterizado especificado na coluna Argument. A coluna Argument também contém um predicado SET:(), que indica o valor com o qual cada coluna está definida. Index Insert é um operador físico. |
|||
Index Scan |
O operador Index Scan recupera todas as linhas do índice não clusterizado especificado na coluna Argument. Se um predicado opcional WHERE: () aparecer na coluna Argument, somente as linhas que atenderem ao predicado serão retornadas. Index Scan é um operador lógico e físico. |
|||
Index Seek |
O operador Index Seek usa a capacidade de busca de índices para recuperar linhas de um índice não clusterizado. A coluna Argument contém o nome do índice não clusterizado usado. Também contém o predicado SEEK:(). O mecanismo de armazenamento usa o índice para processar somente as linhas que atendem ao predicado SEEK:(). Ele pode incluir opcionalmente um predicado WHERE:(), que o mecanismo de armazenamento avaliará em relação a todas as linhas que atenderem ao predicado SEEK:() (não usa os índices para fazer isso). Se a coluna Argument contém a cláusula ORDERED, o processador de consulta determinou que as linhas fossem retornadas na ordem em que o índice não clusterizado as classificou. Se a cláusula ORDERED não estiver presente, o mecanismo de armazenamento pesquisará o índice no modo ideal (o que não garante que a saída será classificada). Permitir que a saída retenha sua ordenação pode ser menos eficiente que produzir saída não classificada. Index Seek é um operador lógico e físico. |
|||
Index Spool |
O operador físico Index Spool contém um predicado SEEK: () na coluna Argument. O operador Index Spool digitaliza suas linhas de entrada, colocando uma cópia de cada linha em um arquivo spool oculto (armazenado no banco de dados tempdb que existe somente durante o tempo de vida da consulta) e cria um índice não clusterizado nas linhas. Isto permite que você use o recurso de busca de índices para produzir somente as linhas que correspondem ao predicado SEEK: (). Se for feito o retrocesso do operador (por exemplo, por um operador Nested Loops) sem que haja necessidade de reassociação, serão usados os dados em spool em vez de um novo exame da entrada. |
|||
Nonclustered Index Update |
O operador físico Nonclustered Index Update atualiza linhas de sua entrada no índice não clusterizado especificado na coluna Argument. Se um predicado SET:() estiver presente, cada coluna atualizada será definida com esse valor. Nonclustered Index Update é um operador físico. |
|||
Online Index Insert |
O operador físico Online Index Insert indica que uma operação de criação, alteração ou remoção de índice é executada online. Ou seja, os dados da tabela subjacente permanecem disponíveis para usuários durante a operação de índice. |
|||
Nenhum |
Parallelism |
O operador Parallelism executa operações lógicas de fluxos de distribuição, recolhimento e repartição. As colunas Argument podem conter um predicado PARTITION COLUMNS: () com uma lista separada por vírgula das colunas que estão sendo particionadas. As colunas Argument também podem conter um predicado ORDER BY: (), listando as colunas para preservar a ordem de classificação durante o particionamento. Parallelism é um operador físico.
|
||
Parameter Table Scan |
O operador Parameter Table Scan examina uma tabela que está atuando como um parâmetro na consulta atual. Normalmente, isto é usado para consultas INSERT dentro de um procedimento armazenado. Parameter Table Scan é um operador lógico e físico. |
|||
Nenhum |
Partial Aggregate |
Agregação parcial é usada em planos paralelos. Aplica uma função de agregação para tantas linhas de entrada quanto possíveis de forma que gravar em disco (conhecido como "derramamento") não é necessário. Hash Match é o único operador físico (iterator) que implementa agregação de partição. Agregação parcial é um operador lógico. |
||
Population Query |
O operador Population Query popula a tabela de trabalho de um cursor quando o cursor é aberto. |
|||
Refresh Query |
O operador Refresh Query busca dados atuais para linhas do buffer de busca. |
|||
Remote Delete |
O operador Remote Delete exclui as linhas de entrada a partir de um objeto remoto. Remote Delete é um operador lógico e físico. |
|||
Remote Index Scan |
O operador de Remote Index Scan examina o índice remoto especificado na coluna Argument. Verificação de Índice Remoto é um operador lógico e físico. |
|||
Remote Index Seek |
O operador de Busca de Índice Remoto usa a busca de um objeto de índice remoto para recuperar linhas. A coluna Argument contém o nome do índice remoto que está sendo usado e o predicado SEEK:(). Busca de Índice Remoto é um operador lógico e físico. |
|||
Remote Insert |
O operador Remote Insert insere linhas de entrada em um objeto remoto. O Remote Insert é um operador lógico e físico. |
|||
Remote Query |
O operador Remote Query submete uma consulta a uma fonte remota. O texto da consulta enviado ao servidor remoto aparece na coluna Argument. Remote Query é um operador lógico e físico. |
|||
Remote Scan |
O operador Remote Scan examina um objeto remoto. O nome do objeto remoto aparece na coluna Argument. Remote Scan é um operador lógico e físico. |
|||
Remote Update |
O operador Remote Update atualiza a linha de entrada em um objeto remoto. Remote Update é um operador lógico e físico. |
|||
Repartition Streams |
O operador Reparticionar Fluxos consome vários fluxos e produz vários fluxos de registros. O conteúdo do registro e o formato não são alterados. Se o otimizador de consulta usar um filtro de bitmap, o número de linhas no fluxo de saída será reduzido. Cada registro de um fluxo de entrada é colocado em um fluxo de saída. Se esse operador for preservador de ordem, todos os fluxos de entrada deverão ser ordenados e mesclados em vários fluxos de saída ordenados. Se a saída for particionada, então a coluna Argument conterá um predicado PARTITION COLUMNS: () e as colunas de particionamento. Se a saída for ordenada, a coluna Argument conterá um predicado ORDER BY:() e as colunas que estão sendo ordenadas. Reparticionar Fluxos atua como um operador lógico. O operador é usado somente em planos de consulta paralelos. |
|||
Result |
O operador Result consiste nos dados retornados ao término de um plano de consulta. Normalmente, é o elemento raiz de um plano de execução. Result é um elemento de linguagem. |
|||
RID Lookup |
RID Lookup é um indicador de pesquisa em um heap que usa um RID (identificador de linha) fornecido. A coluna Argument contém o rótulo de indicador usado para pesquisar a linha na tabela e o nome da tabela em que a linha é pesquisada. RID Lookup sempre é acompanhado por NESTED LOOP JOIN. RID Lookup é um operador físico. Para obter mais informações sobre pesquisas de indicador, consulte o artigo sobre pesquisa de indicadores no blog do SQL Server no MSDN. |
|||
Nenhum |
Right Anti Semi Join |
O operador Right Anti Semi Join efetua a saída de cada linha a partir da segunda (inferior) entrada quando não existe uma linha correspondente na primeira (superior) entrada. Uma linha harmoniosa está definida como uma linha que satisfaz o predicado na coluna Argument (se nenhum predicado existir, cada linha será uma linha harmoniosa). Right Anti Semi Join é um operador lógico. |
||
Nenhum |
Right Outer Join |
O operador Right Outer Join retorna cada linha que satisfaz a junção da segunda entrada (parte inferior) associada a cada linha correspondente da primeira entrada (parte superior). Ele também retorna linhas da segunda entrada que não tiveram linhas correspondentes na primeira entrada, unidas com NULL. Se não houver nenhum predicado de junção na coluna Argument, cada linha será uma linha correspondente. Right Outer Join é um operador lógico. |
||
Nenhum |
Right Semi Join |
O operador Right Semi Join retornará todas as linha da segunda entrada (inferior) quando existir uma linha correspondente na primeira entrada (superior). Se não houver nenhum predicado de junção na coluna Argument, cada linha será uma linha correspondente. Right Semi Join é um operador lógico. |
||
Row Count Spool |
O operador Row Count Spool examina a entrada, contando quantas linhas estão presentes e retornando o mesmo número de linhas sem qualquer dado nelas. Esse operador é usado quando é importante a verificação da existência de linhas, em vez dos dados contidos nas linhas. Por exemplo, se um operador Nested loops executa uma operação left semi join e o predicado de junção se aplica à entrada interna, um spool de contagem de linhas poderá ser colocado no topo da entrada interna do operador Nested loops. Então o operador Nested loops poderá determinar quantas linhas saem do spool de contagem de linhas (porque não são necessários dados reais do lado interno) para determinar se retornará a linha exterior. O Row Count Spool é um operador físico. |
|||
Segment |
Segment é um operador lógico e físico. Divide a entrada definida em segmentos baseado no valor de uma ou mais colunas. Essas colunas são mostradas como argumentos no operador Segment. O operador produz então um segmento por vez. |
|||
Nenhum |
Segment Repartition |
Às vezes, em um plano de consulta paralelo, há regiões conceituais de iteradores. Todos os iteradores dentro de tal região podem ser executados por threads paralelos. As próprias regiões devem ser executadas em série. Alguns dos iteradores Parallelism dentro de uma região individual são chamados Branch Repartition. O iterador Parallelism no limite dessas duas regiões é chamado Segment Repartition. Branch Repartition e Segment Repartition são operadores lógicos. |
||
Sequence |
O operador Sequence conduz amplos planos de atualização. Em termos funcionais, ele executa cada entrada em sequência (da parte superior até a inferior). Cada entrada normalmente é uma atualização de um objeto diferente. Ele retorna somente as linhas que vêm de sua última entrada (parte inferior). Sequence é um operador lógico e físico. |
|||
Sequence Project |
O operador Sequence Project adiciona colunas para executar computações sobre um conjunto ordenado. Divide a entrada definida em segmentos baseado no valor de uma ou mais colunas. O operador produz então um segmento por vez. Estas colunas são mostradas como argumentos no operador Sequence Project. Sequence Project é um operador lógico e físico. |
|||
Snapshot |
O operador Snapshot cria um cursor que não encontra mudanças feitas pelos outros. |
|||
Sort |
O operador Sort classifica todas as linhas de entrada. A coluna Argument contém um predicado DISTINCT ORDER BY: () se duplicatas forem removidas por esta operação, ou um predicado ORDER BY: () com uma lista separada por vírgula das colunas que estão sendo classificadas. As colunas são prefixadas com o valor ASC se as colunas forem classificadas em ordem crescente, ou o valor DESC se as colunas forem classificadas em ordem decrescente. Sort é um operador lógico e físico. |
|||
Split |
O operador Split é usado para otimizar o processamento da atualização. Ele divide cada operação de atualização em uma operação de exclusão e inserção. Split é um operador lógico e físico. |
|||
Spool |
O operador Spool salva um resultado de consulta intermediário no banco de dados tempdb. |
|||
Stream Aggregate |
O operador Stream Aggregate agrupa linhas por uma ou mais colunas e, em seguida, calcula uma ou mais expressões de agregação retornadas pela consulta. A saída deste operador pode ser referenciada por operadores posteriores na consulta, retornada ao cliente, ou ambos. O operador Stream Aggregate requer a entrada de dados ordenada pelas colunas dentro de seus grupos. O otimizador usará um operador Sort antes desse operador se os dados ainda não estiverem classificados em função de um operador Sort anterior ou devido a uma busca ou análise de índice ordenado. Na instrução SHOWPLAN_ALL ou no plano de execução gráfica no SQL Server Management Studio, são listadas as colunas no predicado GROUP BY na coluna Argument, e as expressões de agregação são listadas na coluna Defined Values. Stream Aggregate é um operador físico. |
|||
Switch |
Switch é um tipo especial de iterador de concatenação que tem n entradas. Uma expressão é associada a cada operador Switch. Dependendo do valor de retorno da expressão (entre 0 e n-1), o Switch copia o fluxo de entrada apropriado ao fluxo de saída. Um uso de Switch é implementar planos de consulta envolvendo cursores de avanço rápido com determinados operadores, como o operador TOP. Switch é um operador lógico e físico. |
|||
Table Delete |
O operador físico Table Delete exclui linhas da tabela especificadas na coluna Argument do plano de execução da consulta. |
|||
Table Insert |
O operador Table Insert insere linhas de sua entrada na tabela especificada na coluna Argument do plano de execução de consulta. A coluna Argument também contém um predicado SET: (), que indica o valor para o qual cada coluna está definida. Se Table Insert não tiver nenhum filho para valores de inserção, então a linha inserida será tirada do próprio operador Insert. Table Insert é um operador físico. |
|||
Table Merge |
O operador Table Merge aplica um fluxo de dados de mesclagem a um heap. O operador exclui, atualiza ou insere linhas na tabela especificada na coluna Argument do operador. A operação real executada depende do valor do tempo de execução da coluna ACTION especificada na coluna Argument do operador. Table Merge é um operador físico. |
|||
Table Scan |
O operador Table Scan recupera todas as linhas da tabela especificada na coluna Argument do plano de execução da consulta. Se um predicado WHERE:() aparecer na coluna Argument, somente as linhas que atenderem ao predicado serão retornadas. Table Scan é um operador lógico e físico. |
|||
Table Spool |
O operador Table Spool examina a entrada e coloca uma cópia de cada linha em uma tabela de spool oculta que é armazenada no banco de dados tempdb e existe durante o tempo de vida da consulta. Se for feito o retrocesso do operador (por exemplo, por um operador Nested Loops) sem que haja necessidade de reassociação, serão usados os dados em spool em vez de um novo exame da entrada. Table Spool é um operador físico. |
|||
Table Update |
O operador físico Table Update atualiza linhas de entrada na tabela especificada na coluna Argument do plano de execução de consulta. O predicado SET: () determina o valor de cada coluna atualizada. Esses valores podem ser consultados na cláusula SET ou em outro lugar dentro desse operador assim como em outro lugar dessa consulta. |
|||
Table-valued Function |
O operador Table-valued Function avalia uma função com valor de tabela (Transact-SQL ou CLR) e armazena as linhas resultantes no banco de dados tempdb. Quando os iteradores pai solicitam as linhas, a Função com valor de tabela retorna as linhas de tempdb. As consultas com chamadas às funções com valor de tabela geram planos de consulta com o iterador da Função com valor de tabela. A Função com valor de tabela pode ser avaliada com valores de parâmetros diferentes:
A Função com valor de tabela é um operador lógico e físico. |
|||
Início |
O operador Top verifica a entrada, retornando só o primeiro número ou porcentagem de linhas especificado, possivelmente com base em uma ordem de classificação. A coluna Argument pode conter uma lista das colunas cujas associações estão sendo verificadas. Em planos de atualização, o operador Top é usado para aplicar os limites de contagem de linhas. Top é um operador lógico e físico. Top é um operador lógico e físico. |
|||
Nenhum |
Top N Sort |
Top N Sort é semelhante ao iterador Sort, com exceção de que somente as primeiras N linhas são necessárias e não todo o conjunto de resultados. Para valores pequenos de N, o mecanismo de execução de consultas do SQL Server tenta executar toda a operação de classificação na memória. Para valores grandes de N, o mecanismo de execução de consultas recorre a um método de classificação mais genérico para o qual N não é um parâmetro. |
||
UDX |
Operadores estendidos (UDX) implementam uma de muitas operações XQuery e XPATH no SQL Server. Todos os operadores UDX são classificados como operadores lógicos e físicos. O operador estendido (UDX) FOR XML é usado para serializar o conjunto relacional de linhas e insere em representação XML em uma única coluna BLOB, e em uma única linha de saída. É um operador de agregação XML sensível à ordenação. O operador estendido (UDX) XML SERIALIZER é um operador de agregação XML sensível à ordenação. Ele insere linhas que representam nós XML ou escalares de XQuery em ordem de documento XML e produz um XML BLOB serializado em uma única coluna XML em uma única linha de saída. O operador estendido (UDX) XML FRAGMENT SERIALIZER é um tipo especial de XML SERIALIZER que é usado para processar linhas de entrada que representam fragmentos de XML que são inseridos na extensão de modificação de dados de inserção de XQuery. O operador estendido (UDX) XQUERY STRING avalia o valor da cadeia de caracteres XQuery das linhas de entrada que representam nós de XML. É um operador de agregação de cadeia sensível à ordenação. Produz uma linha com colunas que representam o escalar de XQuery que contém o valor de cadeia de caracteres da entrada. O operador estendido (UDX) XQUERY LIST DECOMPOSERé um operador de decomposição de lista de XQuery. Para cada linha de entrada que representa um nó de XML ele produz uma ou mais linhas, cada uma representando o escalar de Xquery, que contém um valor de elemento de lista caso a entrada seja do tipo lista de XSD. O operador estendido (UDX) XQUERY DATA avalia a função XQuery fn:data() na entrada que representa os nós XML. É um operador de agregação de cadeia sensível à ordenação. Ele produz uma linha com colunas que representam o escalar de XQuery que contém o resultado de fn:data(). O operador estendido (UDX) XQUERY CONTAINS avalia a função XQuery fn:contains() na entrada que representa os nós XML. É um operador de agregação de cadeia sensível à ordenação. Ele produz uma linha com colunas que representam o escalar de XQuery que contém o resultado de fn:contains(). O operador estendido UPDATE XML NODE atualiza o nó XML na extensão de modificação de dados de substituição XQuery no métodomodify() no tipo XML. |
|||
Nenhum |
Union |
O operador Union verifica várias entradas, gerando a saída de cada linha examinada e removendo duplicatas. Union é um operador lógico. |
||
Update |
O operador Update atualiza cada linha de sua entrada no objeto especificado na coluna Argument do plano de execução de consulta. Update é um operador lógico. O operador físico é Table Update, Index Update ou Clustered Index Update. |
|||
While |
O operador While implementa Transact-SQL durante o loop. While é um elemento de linguagem |
|||
Window Spool |
O operador Window Spool expande cada linha no conjunto de linhas que representa a janela associada a ele. Em uma consulta, a cláusula OVER define a janela em um conjunto de resultados de consulta e uma função de janela, e depois computa um valor para cada linha na janela. Window Spool é um operador lógico e físico. |