単純なSELECT
ステートメントがあります。
USE [AdventureWorks2014]
GO
SELECT *
FROM Sales.SalesOrderDetail sod
実行計画には2つのCompute Scalar
。
なぜですか? Index Scan
または多分Table Scan
?
最初の(rght-most)は
[[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)))
2番目の場合:
[[sod].LineTotal] = Scalar Operator([AdventureWorks2014].[Sales].[SalesOrderDetail].[LineTotal] as [sod].[LineTotal])
計算スカラーは、計算フィールドLineTotalに関連しています。テーブルをスクリプト化すると、次のように定義されたフィールドが表示されます。
[LineTotal] AS (isnull(([UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty],(0.0))),
SQL Serverには、実行する2つの操作があります。最初に次の計算を実行する必要があります。
[UnitPrice]*((1.0)-[UnitPriceDiscount]))*[OrderQty]
次に、その値がnullかどうかを確認し、nullの場合は0.0に置き換えます。