Operador escalar en Buscar predicado

8

Tengo la siguiente versión simplificada de mi consulta real, en SQL Server 2012. Tiene un operador escalar en el predicado de búsqueda al seleccionar datos de la tabla Contenedores.

¿Cuál es el propósito del operador escalar en este predicado de búsqueda?

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)

Plan de ejecución

ingrese la descripción de la imagen aquí

Buscar predicado

ingrese la descripción de la imagen aquí

LCJ
fuente

Respuestas:

10

¿Cuál es el propósito del operador escalar en este predicado de búsqueda?

El "Operador escalar" en la olic.ContainerIDcolumna de la pregunta simplemente indica que la referencia externa de la columna proporciona una sola fila (escalar) por iteración del bucle anidado (aplicar). Es puramente arquitectónico y no hay nada de qué preocuparse.

Detalles

Internamente, el procesador de consultas actúa en una representación de árbol, que en un nivel básico contiene una combinación de operaciones relacionales (con valores de tabla) y escalares (de una sola fila).

Cuando SQL Server se basa resultado de presentación, se pide a cada operador en el árbol (que está habilitada para el plan de presentación pública) para producir una representación adecuada para el objetivo de producción ( SHOWPLAN_XML, SHOWPLAN_TEXT, STATISTICS XML... y así sucesivamente).

El XMLformato de salida debe cumplir con el esquema del plan de presentación , que contiene elementos para operadores tanto relacionales como escalares. El esquema especifica elementos de operador escalares en muchos lugares.

Si el texto específico "Operador escalar (...)" aparece en una información sobre herramientas de SSMS, en la ventana Propiedades o solo en el XML sin formato depende de los detalles de implementación en cada capa.

Por ejemplo, la consulta simple:

SELECT TOP (1) 1;

... produce un plan sin "Operador escalar" en la información sobre herramientas de SSMS, pero presente para el operador relacional Compute Scalar en la ventana de propiedades:

Calcular operador escalar escalar

... y solo en el XML sin procesar para el operador relacional superior:

Operador escalar superior

A todos los efectos prácticos, el texto "Operador escalar" simplemente debe ignorarse. No significa nada excepto que lo que encierra es un escalar.

Paul White 9
fuente
3

¿Cuál es el propósito del operador escalar en este predicado de búsqueda?

El operador escalar es "como". Está aliasando la columna. Ahora, ¿por qué está pasando esto? Eso requirió un poco de investigación y todavía no encontré una respuesta 100% concreta. La única referencia que encontré fue en los Planes de ejecución del servidor SQL, segunda edición. El libro menciona que esta operación en un predicado de búsqueda ocurre cuando el optimizador decide cambiar el orden de una unión o búsqueda.

Anthony Genovese
fuente
2
Esta fue una buena suposición de Grant cuando escribió ese libro, pero me temo que no es correcto.
Paul White 9