Sql server 以下哪项查询更好(更高效)?

Sql server 以下哪项查询更好(更高效)?,sql-server,tsql,Sql Server,Tsql,这两个查询中哪一个优化得更好: SELECT item.id, dbo.fnCalculatePurchasePrice(item.id, 0, DEFAULT, DEFAULT, DEFAULT) AS cost FROM Item item 或 我认为第一个查询更好,因为我们只有简单的选择。第二个查询具有成本更高的交叉应用操作。这两个查询对于您的情况相似,因为两个查询相同。。您可以从执行计划中看到同样的情况 下面的代码每行执行一次 SELECT item.id

这两个查询中哪一个优化得更好:

SELECT 
    item.id, 
    dbo.fnCalculatePurchasePrice(item.id, 0, DEFAULT, DEFAULT, DEFAULT) AS cost
FROM 
    Item item


我认为第一个查询更好,因为我们只有简单的选择。第二个查询具有成本更高的交叉应用操作。

这两个查询对于您的情况相似,因为两个查询相同。。您可以从执行计划中看到同样的情况

下面的代码每行执行一次

SELECT item.id, dbo.fnCalculatePurchasePrice(item.id, 0, DEFAULT, DEFAULT, DEFAULT) AS cost
FROM Item item
具有交叉应用的行也会执行相同的操作。对于select中的每一行,将执行交叉应用,并拒绝空值

您可以从下面的演示中看到相同的内容。数字表有超过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)
现在观察两个批次的执行计划成本


如果第二个需要更长的时间,那么我认为你的答案是显而易见的。我会寻找一种方法来实现你想要的没有功能,因为它们通常是昂贵的,因为它们都需要相同的时间。但这可能是因为我执行一个查询而不是另一个查询时出现了互联网问题,服务器也在另一台电脑上。您可以发布函数代码吗?用内联表值函数替换标量函数将是最好的选择…或者在查询中进行计算会更快,但如果您需要重用它,这并不总是最好的选择。将函数作为选择列不是一种好的做法。最好创建一个待加入的TBF。
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)