更好地优化了这两个查询中的哪一个:
SELECT
item.id,
dbo.fnCalculatePurchasePrice(item.id, 0, DEFAULT, DEFAULT, DEFAULT) AS cost
FROM
Item item
或
SELECT
item.id, a.cost
FROM
Item item
CROSS APPLY
(SELECT
dbo.fnCalculatePurchasePrice(item.id, 0, DEFAULT, DEFAULT, DEFAULT) AS cost) a
我认为第一个查询更好,因为我们只有简单的选择。第二个查询的操作成本更高CROSS APPLY
。
答案 0 :(得分:3)
两者的情况类似,因为两个查询都相同..您可以从执行计划中看到相同的内容
下面的代码每行执行
SELECT item.id, dbo.fnCalculatePurchasePrice(item.id, 0, DEFAULT, DEFAULT, DEFAULT) AS cost
FROM Item item
带交叉应用的一个也做同样的事情。对于select cross中的每一行,执行并且空值被拒绝
你可以从下面看到相同的demo ..numbers表有超过70K行
alter function dbo.sc
(
@val int
)
returns int
as
begin
return @val
end
select * ,dbo.sc(number)
from numbers
select *
from
numbers n
cross apply
(select dbo.sc(number)) b(A)
现在观察两个批次的执行计划成本