为什么这个执行计划有计算标量?

Ban*_*San 9 performance sql-server optimization execution-plan

我有一个简单的SELECT声明。

USE [AdventureWorks2014]
GO

SELECT *
FROM Sales.SalesOrderDetail sod
Run Code Online (Sandbox Code Playgroud)

执行计划有两个Compute Scalar.

显示计算标量的执行计划 为什么是这样?我原以为只得到Index Scan或者Table Scan?

第一个(最右边的)有

 [[AdventureWorks2014].[Sales].[SalesOrderDetail].LineTotal] = Scalar Operator(isnull(CONVERT_IMPLICIT(numeric(19,4),[AdventureWorks2014].[Sales].[SalesOrderDetail].[UnitPrice] as [sod].[UnitPrice],0)*((1.0)-CONVERT_IMPLICIT(numeric(19,4),[AdventureWorks2014].[Sales].[SalesOrderDetail].[UnitPriceDiscount] as [sod].[UnitPriceDiscount],0))*CONVERT_IMPLICIT(numeric(5,0),[AdventureWorks2014].[Sales].[SalesOrderDetail].[OrderQty] as [sod].[OrderQty],0),(0.000000)))
Run Code Online (Sandbox Code Playgroud)

当第二个有:

[[sod].LineTotal] = Scalar Operator([AdventureWorks2014].[Sales].[SalesOrderDetail].[LineTotal] as [sod].[LineTotal])
Run Code Online (Sandbox Code Playgroud)

Bre*_*zar 18

计算标量与计算字段 LineTotal 相关。编写表格脚本,您将看到该字段定义为:

[LineTotal]  AS (isnull(([UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty],(0.0))),
Run Code Online (Sandbox Code Playgroud)

SQL Server 有两个操作要执行。它必须首先运行以下计算:

[UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty]
Run Code Online (Sandbox Code Playgroud)

然后它必须检查该值是否为空,如果是,则替换为 0.0。