Eu segui a 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 de contêineres.
Qual é o propósito do operador escalar neste 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
Procurar Predicado
O "Operador escalar" na
olic.ContainerID
coluna da pergunta simplesmente indica 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 consulta 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 a saída do showplan, cada operador na árvore (que está habilitado para showplan público) é solicitado a produzir uma representação adequada para o destino de saída (
SHOWPLAN_XML
,SHOWPLAN_TEXT
,STATISTICS XML
... e assim por diante).O
XML
formato de saída deve estar em conformidade com o esquema showplan , que contém elementos para operadores relacionais e escalares. O esquema especifica os 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 de implementação em cada camada.
Por exemplo, a consulta simples:
...produz um plano sem "Scalar Operator" nas dicas do SSMS, mas presente para o operador relacional Compute Scalar na janela de propriedades:
...e apenas no XML bruto para o operador relacional Top:
Para todos os propósitos práticos, o texto "Operador escalar" deve ser simplesmente ignorado. Não significa nada, exceto que a coisa que encerra é um escalar.
O operador escalar é "as". É aliasing a 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 em Sql Server Execution Plans, 2nd Edition. O livro menciona que essa operação em um predicado de busca ocorre quando o otimizador decide alterar a ordem de uma junção ou busca.