Opérateur scalaire dans Seek Predicate

8

J'ai la version simplifiée suivante de ma requête réelle, dans SQL Server 2012. Il a un opérateur scalaire dans la recherche de prédicat lors de la sélection des données de la table Containers.

Quel est le rôle de l'opérateur scalaire dans ce prédicat de recherche?

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 d'exécution

entrez la description de l'image ici

Recherche de prédicat

entrez la description de l'image ici

LCJ
la source

Réponses:

10

Quel est le rôle de l'opérateur scalaire dans ce prédicat de recherche?

L '"opérateur scalaire" sur la olic.ContainerIDcolonne de la question indique simplement que la référence externe de la colonne fournit une seule ligne (scalaire) par itération de la boucle imbriquée (appliquer). C'est purement architectural et rien à craindre.

Détails

En interne, le processeur de requêtes agit sur une représentation arborescente qui, à un niveau de base, contient une combinaison d'opérations relationnelles (table) et scalaires (ligne unique).

Lorsque SQL Server construit showplan, chaque opérateur dans l'arbre (qui est activé pour showplan public) est invité à produire une représentation appropriée pour la cible de sortie ( SHOWPLAN_XML, SHOWPLAN_TEXT, STATISTICS XML... et ainsi de suite).

Le XMLformat de sortie doit être conforme au schéma showplan , qui contient des éléments pour les opérateurs relationnels et scalaires. Le schéma spécifie des éléments d'opérateur scalaire à de nombreux endroits.

Le fait que le texte spécifique "Opérateur scalaire (...)" apparaisse dans une info-bulle SSMS, dans la fenêtre Propriétés ou uniquement dans le XML brut dépend des détails d'implémentation de chaque couche.

Par exemple, la requête simple:

SELECT TOP (1) 1;

... produit un plan sans "Opérateur scalaire" dans les info-bulles SSMS, mais présent pour l'opérateur relationnel Calculer scalaire dans la fenêtre des propriétés:

Opérateur de calcul scalaire scalaire

... et uniquement dans le XML brut de l'opérateur relationnel supérieur:

Opérateur scalaire supérieur

À toutes fins pratiques, le texte "Opérateur scalaire" doit simplement être ignoré. Cela ne signifie rien sauf que la chose qu'il renferme est un scalaire.

Paul White 9
la source
3

Quel est le rôle de l'opérateur scalaire dans ce prédicat de recherche?

L'opérateur scalaire est "as". Il alias la colonne. Maintenant, pourquoi cela se produit-il? Cela a pris un peu de fouille et je n'ai toujours pas vraiment trouvé de réponse 100% concrète. La seule référence que j'ai trouvée était dans Sql Server Execution Plans, 2nd Edition. Le livre mentionne que cette opération dans un prédicat de recherche se produit lorsque l'optimiseur décide de changer l'ordre d'une jointure ou d'une recherche.

Anthony Genovese
la source
2
C'était une bonne supposition par Grant au moment où il a écrit ce livre, mais ce n'est pas correct, je le crains.
Paul White 9