Eu tenho uma SELECT
declaração simples.
USE [AdventureWorks2014]
GO
SELECT *
FROM Sales.SalesOrderDetail sod
O plano de execução tem dois arquivos Compute Scalar
.
Por que é isso? Eu esperava apenas obter o
Index Scan
ou talvez um Table Scan
?
O primeiro (mais à direita) tem
[[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)))
Quando o segundo tem:
[[sod].LineTotal] = Scalar Operator([AdventureWorks2014].[Sales].[SalesOrderDetail].[LineTotal] as [sod].[LineTotal])
Os escalares de computação estão relacionados ao campo calculado LineTotal. Faça o script da tabela e você verá esse campo definido como:
O SQL Server tem duas operações a serem executadas. Ele deve primeiro executar o cálculo de:
Em seguida, ele deve verificar se esse valor é nulo e, se for, substituir por 0,0.