Operador escalar no predicado de busca

8

Tenho a seguinte versão simplificada da minha consulta real, no SQL Server 2012. Ele tem um operador escalar no predicado de busca ao selecionar dados da tabela Containers.

Qual é o objetivo do operador escalar nesse predicado de busca?

CREATE TABLE #EligibleOrders (OrderID INT PRIMARY KEY,
                             StatusCD CHAR(3),
                              CreatedOnDate DATETIME
                              )
--insert logic into #EligibleOrders

--Final Query
SELECT T2.OrderID ,olic.LineItemID,
        SUM(c.quantity) AS ShippedQty,
        COUNT(DISTINCT c.ContainerID) AS ShippedCases
FROM #EligibleOrders T2
INNER JOIN dbo.OrderLineItemContainers (NOLOCK) AS olic 
    ON  olic.OrderID = T2.OrderID
INNER JOIN dbo.Containers (NOLOCK) AS c
    ON olic.Containerid = c.Containerid
GROUP BY T2.OrderID ,olic.LineitemID 
OPTION (MAXDOP 1)

Plano de execução

insira a descrição da imagem aqui

Procurar Predicado

insira a descrição da imagem aqui

LCJ
fonte

Respostas:

10

Qual é o objetivo do operador escalar nesse predicado de busca?

O "Operador escalar" na olic.ContainerIDcoluna da pergunta indica simplesmente que a referência externa da coluna está fornecendo uma única linha (escalar) por iteração do loop aninhado (aplicar). É puramente arquitetônico e nada para se preocupar.

Detalhes

Internamente, o processador de consultas atua em uma representação em árvore, que em um nível básico contém uma combinação de operações relacionais (com valor de tabela) e escalares (linha única).

Quando o SQL Server cria saída showplan, cada operador na árvore (que está habilitado para showplan público) é convidado a produzir uma representação adequada para a meta de produção ( SHOWPLAN_XML, SHOWPLAN_TEXT, STATISTICS XML... e assim por diante).

O XMLformato de saída deve estar em conformidade com o esquema showplan , que contém elementos para operadores relacionais e escalares. O esquema especifica elementos do operador escalar em muitos lugares.

Se o texto específico "Operador escalar (...)" aparece em uma dica de ferramenta do SSMS, na janela Propriedades ou apenas no XML bruto, depende dos detalhes da implementação em cada camada.

Por exemplo, a consulta simples:

SELECT TOP (1) 1;

... produz um plano sem "Operador escalar" nas dicas de ferramenta do SSMS, mas presente para o operador relacional Compute Scalar na janela de propriedades:

Operador de computação escalar escalar

... e apenas no XML bruto para o operador relacional Top:

Operador escalar superior

Para todos os fins práticos, o texto "Operador escalar" deve ser simplesmente ignorado. Isso não significa nada, exceto que o que inclui é um escalar.

Paul White 9
fonte
3

Qual é o objetivo do operador escalar nesse predicado de busca?

O operador escalar é "como". Está usando o alias da coluna. Agora, por que isso está acontecendo? Demorou um pouco para cavar e ainda não encontrei uma resposta 100% concreta. A única referência que encontrei foi no Sql Server Execution Plans, 2ª Edição. O livro menciona que esta operação em um predicado de busca ocorre quando o otimizador decide alterar a ordem de uma junção ou procura.

Anthony Genovese
fonte
2
Foi um bom palpite de Grant na época em que ele escreveu esse livro, mas não está correto, receio.
Paul White 9