当前位置: 首页 > 面试题库 >

为什么简单的T-SQL UDF函数会使代码执行慢3倍

杜河
2023-03-14
问题内容

我正在重写一些旧的存储过程,并且在使用函数而不是内联代码时遇到了意外的性能问题。

该功能非常简单,如下所示:

ALTER FUNCTION [dbo].[GetDateDifferenceInDays] 
(       
@first_date SMALLDATETIME, 
@second_date SMALLDATETIME
)
RETURNS INT 
AS
BEGIN

RETURN ABS(DATEDIFF(DAY, @first_date, @second_date))

END

因此,我有两个相同的查询,但是一个使用该函数,另一个使用查询本身进行计算:

ABS(DATEDIFF(DAY, [mytable].first_date, [mytable].second_date))

现在,使用内联代码的查询运行速度比使用该函数的查询快3倍。


问题答案:

您拥有的是一个标量UDF(接受0到n个参数并返回一个标量值)。除非使用常量参数调用,否则此类UDF通常会导致查询的逐行操作,从而导致查询性能下降。

有关使用UDF的性能陷阱的详细说明,请参见此处,
此处和此处。



 类似资料:
  • 我最近用Java写了一个计算密集型算法,然后把它翻译成C++。令我吃惊的是,C++的执行速度要慢得多。我现在已经编写了一个更短的Java测试程序,以及一个相应的C++程序-参见下面。我的原始代码具有大量的数组访问功能,测试代码也是如此。C++的执行时间要长5.5倍(请参阅每个程序末尾的注释)。 以下1st21条评论后的结论... null null Java代码: C++代码:

  • 问题内容: 考虑以下功能: 它们应该是等效的。但是存在性能差异: 不带的版本else慢10%。这非常重要。为什么? 问题答案: 对我来说,它们的速度几乎相同:(Debian上的Python 2.6.6) 字节码也非常相似: 唯一的区别是,如果控制到达函数主体的末尾,则else返回包含代码的版本None。

  • 问题内容: 一个简单的程序,用于计算数字平方并存储结果: 这两个选项的数组处理是否可能有所不同?我的实际程序会有一些更复杂的东西,但这 是我需要尽可能简单地并行化的一种计算方式 ,但没有这种结果。 问题答案: 从以下文档中: 如果您知道所调用的函数基于已编译的扩展,该扩展会在大多数计算过程中释放Python全局解释器锁(GIL)… 问题在于,在这种情况下,您不知道这一点。Python本身仅允许一次

  • 问题内容: 我已经修改了一些Go代码,以解决与我姐夫玩的电子游戏有关的我的好奇心。 本质上,下面的代码模拟了游戏中与怪物的互动,以及他期望他们在失败后掉落物品的频率。我遇到的问题是,我希望这样的一段代码非常适合并行化,但是当我并发添加时,完成所有模拟所花费的时间往往会使原始代码的速度降低4-6倍没有并发。 为了使您更好地理解代码的工作方式,我有三个主要功能:交互功能,它是玩家和怪物之间的简单交互。

  • 题目地址 : https://leetcode.cn/problems/flatten-nested-list-iterator/ 为什么会出错呢?

  • 问题内容: 我用 和做了一些测试 。他们似乎都慢于。是因为精度更高吗?计算斜边函数的方法是什么?令人惊讶的是,我在文档中找不到任何表明性能不佳的迹象。 问题答案: 这不是一个简单的sqrt函数。您应该检查此链接以实现算法:http : //www.koders.com/c/fid7D3C8841ADC384A5F8DE0D081C88331E3909BF3A.aspx 它具有while循环以检查收