我在 SQL Server 2012 中有以下实际查询的简化版本。从容器表中选择数据时,它在搜索谓词中有一个标量运算符。
在这个搜索谓词中标量运算符的目的是什么?
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)
执行计划
寻求谓词
问题中列上的“标量运算符”
olic.ContainerID
仅表示列外部引用在嵌套循环(应用)的每次迭代中提供单行(标量)。它纯粹是架构性的,没有什么可担心的。细节
在内部,查询处理器作用于树表示,它在基本级别包含关系(表值)和标量(单行)操作的组合。
当 SQL Server 构建 showplan 输出时,树中的每个运算符(为公共 showplan 启用)都被要求生成适合输出目标的表示(
SHOWPLAN_XML
,SHOWPLAN_TEXT
,STATISTICS XML
... 等等)。XML
输出格式必须符合showplan schema,其中包含关系运算符和标量运算符的元素。该模式在许多地方指定了标量运算符元素。特定文本“Scalar Operator(...)”是出现在 SSMS 工具提示中、属性窗口中还是仅出现在原始 XML 中取决于每一层的实现细节。
例如,简单的查询:
...在 SSMS 工具提示中生成一个没有“标量运算符”的计划,但在属性窗口中为计算标量关系运算符提供:
...并且仅在 Top 关系运算符的原始 XML 中:
出于所有实际目的,应该简单地忽略“标量运算符”文本。除了它所包含的东西是一个标量之外,它没有任何意义。
标量运算符是“as”。它正在为列起别名。现在为什么会这样?这需要一些挖掘,我仍然真的没有找到 100% 具体的答案。我发现它的唯一参考是在Sql Server Execution Plans, 2nd Edition 中。 该书提到,当优化器决定更改连接或搜索的顺序时,会发生搜索谓词中的此操作。