我正在测试在查询中使用简单函数的成本,因为我读它会减慢查询速度,所以我做了一个求和函数并在数字表(100000个数字)上测试它。当我看到结果时,我很困惑,因为我没有看到任何区别。
当我不使用该功能时,我有任何理由没有看到性能提升......?
这是我的功能:
create function [dbo].[calculator]
(
@a bigint,
@b bigint
)
returns bigint
as
begin
return @a + @b;
end
以下是查询:
declare @top bigint = 100
select
n.n,
n2.n,
dbo.calculator(n.n,n2.n)
from dbo.Nums100 n
cross join dbo.Nums100 n2
where dbo.calculator(n.n,n2.n) < @top;
select
n.n,
n2.n,
n.n+n2.n
from dbo.Nums100 n
cross join dbo.Nums100 n2
where n.n + n2.n < @top;
select
n.n,
n2.n,
calc.s
from dbo.Nums100 n
cross join dbo.Nums100 n2
cross apply(values(dbo.calculator(n.n,n2.n)))calc(s)
where calc.s < @top;
答案 0 :(得分:0)
SQL性能是非常复杂的艺术。
函数的成本通常不是函数本身(除非复杂),但通常是对查询的总体影响。例如,使用Table Valued函数很容易导致统计信息丢失,这意味着SQL将为返回的行数计划不佳。 使用已发布的标量函数可以在所有过滤之前执行,因此可能比所需的运行次数更多(在您的示例中不重要,因为它并不复杂) 此外,当用于过滤或连接表达式时,它们可能导致索引不被使用,并且可能在执行计划中造成严重破坏(有时会导致表扫描)。 有时它也会导致并行性的丢失,这种情况实际上只能在大规模上看到。
故事的道德?如果它在你的特定情况下工作得足够快,那么很棒。但是,不要试图缩小或过度简单地解决问题,并假设结果会直接缩放。
函数本身不是问题,但如果不小心使用它们会导致问题(像大多数其他SQL功能一样)