查询中的性能函数

Performance functions inside queries

我正在测试在查询中使用简单函数的成本,因为我读到它会减慢查询速度,所以我创建了一个求和函数并在数字 table(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;

SQL表演是一门非常复杂的艺术。

函数的成本通常不是函数本身(除非很复杂),但通常是对查询的整体影响。例如,使用 Table 赋值函数很容易导致统计数据丢失,这意味着 SQL 将无法很好地规划返回的行数。 使用发布的标量函数可能会在所有过滤之前执行,因此可能比需要的次数多 运行 (在您的示例中并不重要,因为它并不复杂) 此外,当用于过滤或连接表达式时,它们可能会导致索引不被使用,并且会对执行计划造成严重破坏(有时会导致 table 扫描)。 有时它还会导致并行性损失,这种情况实际上只在大规模情况下才会出现。

故事的寓意?如果它在您的特定情况下对您来说足够快,那就太好了。但不要试图缩小或过于简单化问题并假设结果将直接扩大。

功能本身没有问题,但如果不小心使用它们可能会导致问题(与大多数其他 SQL 功能一样)