查询中的性能函数

时间:2015-02-28 15:44:34

标签: sql-server sql-server-2008 tsql sql-execution-plan

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

1 个答案:

答案 0 :(得分:0)

SQL性能是非常复杂的艺术。

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

故事的道德?如果它在你的特定情况下工作得足够快,那么很棒。但是,不要试图缩小或过度简单地解决问题,并假设结果会直接缩放。

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