问题标签 [user-defined-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1191 浏览

asp.net - 如何编写用户定义函数?

我想把它写成用户定义的函数:

这可能与UDF有关吗?

0 投票
2 回答
2993 浏览

sql-server - 如何解决 SQL Server - 基于参数的内联表值函数执行计划变化?

情况如下:
我有一个带有 datetime 参数的表值函数,例如 tdf(p_date),它过滤大约 200 万行,选择列 date 小于 p_date 的行,并计算其他列的一些聚合值。
它工作得很好,但如果 p_date 是一个自定义标量值函数(在我的例子中返回一天结束),执行计划就会改变,查询从 1 秒到 1 分钟执行时间。

概念证明表 - 1K 产品,2M 行:

内联表值函数:

标量值函数:

查询 1 - 工作得很好

执行计划结束:Stream Aggregate Cost 13% <--- Clustered Index Scan Cost 86%

查询 2 - 不太好

执行计划结束:Stream Aggregate Cost 4% <--- Filter Cost 12% <--- Clustered Index Scan Cost 86%

0 投票
2 回答
29270 浏览

sql - 在多行上执行表值函数?

给定一个表值函数,例如dbo.Split()来自"T-SQL: Opposite to string concatenation - how to split string into multiple records",我如何将多行作为参数传递?

这有效:

它返回:

但这不会:

这也不是:

文档说:

在子查询的 FROM 子句中调用返回表的用户定义函数时,函数参数不能引用外部查询中的任何列。

我正在寻找的那种结果集看起来像:

有没有办法(当然,除了光标)来完成这个?

(编辑)

根据 MarlonRibunal 的要求,生成上述结果的示例表如下所示:

id是一个intmyColumn是一个varchar(max)

0 投票
2 回答
1750 浏览

sql - 解决 UDF 性能问题 - 手动缓存

我的系统做了一些相当繁重的处理,我一直在攻击性能,以便让我能够在更短的时间内运行更多的测试运行。

我有很多情况下,UDF 必须被调用,比如说 500 万行(我几乎认为没有办法绕过它)。

好吧,事实证明,有一种方法可以解决这个问题,并且当通过一组比总行集小一些的不同参数调用 UDF 时,它可以显着提高性能。

考虑一个 UDF,它接受一组输入并返回基于复杂逻辑的结果,但是对于超过 5m 行的输入集,只有 100,000 个不同的输入,所以它只会产生 100,000 个不同的结果元组(我的特别从利率到复杂的代码分配,情况各不相同,但它们都是离散的——这种技术的基本点是,您可以通过运行SELECT DISTINCT) 来简单地确定该技巧是否有效。

我发现通过这样做:

当 PreCalcs 被适当索引时,将其与:

你会在性能上获得巨大的提升。显然,仅仅因为某些东西是确定性的,并不意味着 SQL Server 正在缓存过去的调用并重新使用它们,正如人们可能认为的那样。

您唯一需要注意的是允许 NULL 的位置,然后您需要仔细修复连接:

希望这会有所帮助,并且欢迎使用 UDF 或重构查询以提高性能的任何类似技巧。

我想问题是,为什么这样的手动缓存是必要的——服务器不知道函数是确定性的吗?如果它产生了如此大的差异,并且如果 UDF 如此昂贵,那么优化器为什么不直接在执行计划中进行呢?

0 投票
4 回答
11759 浏览

sql - 为什么 UDF 比子查询慢得多?

我有一个案例,我需要从同一个表中翻译(查找)几个值。我写它的第一种方式是使用子查询:

因为我经常使用这个子查询(也就是说,我有大约 50 个包含这些字段的表),我可能需要向子查询添加更多代码(例如, "AND active = 1" )我想我' d 将它们放入用户定义的函数UDF并使用它。但是使用该 UDF 的性能非常糟糕。

#1 的性能不到 1 秒。#2 的性能大约是 30 秒...

为什么,或者更重要的是,有什么方法可以在 SQL Server 2008 中编码,这样我就不必使用这么多子查询了?

编辑:

只是对何时有用的更多解释。当我想为用户获取文本时,这个简单的查询(即获取用户 ID)变得更加复杂,因为我必须加入个人资料才能获取语言,并与公司一起查看是否应该获取语言'而是从那里编辑,并使用翻译表来获取翻译后的文本。对于这些查询中的大多数,性能是可读性和可维护性的次要问题。

0 投票
2 回答
1956 浏览

sql-server - 带有存储过程的 SQL 游标与带有 UDF 的查询

我正在尝试优化我正在维护的存储过程,并且想知道是否有人可以让我了解以下选项的性能优势/劣势。对于我的解决方案,我基本上需要对存储在表中的 IMAGE 列中的图像运行转换程序。转换过程位于外部 .EXE 文件中。这是我的选择:

  1. 将目标表的结果拉到一个临时表中,然后使用游标遍历表中的每一行并在 IMAGE 列上运行存储过程。存储过程调用.EXE。

  2. 创建一个调用 .EXE 文件的 UDF,并运行类似于“从 TargetTable 中选择 UDFNAME(Image_Col)”的 SQL 查询。

我想我正在寻找的是创建光标会增加多少开销的想法,而不是作为一个集合来做?

一些附加信息:

  • 在这种情况下,集合的大小是最大值。1000
  • 正如下面提到的答案,如果使用 UDF 作为一组完成,这是否意味着外部程序一次打开 1000 次?或者是否有针对此的优化?显然,在多处理器系统上,运行多个进程实例可能不是一件坏事,但 1000 个可能有点多。
0 投票
1 回答
2394 浏览

sql-server - 基于应用于列的标量函数的索引

我有一个用户标量值函数,它接受 NVARCHAR(MAX) 并返回 NVARCHAR(MAX)。为了提高使用此功能的 GROUP BY 命令的性能,我想也基于它创建一个索引。但是文档说 CREATE INDEX 命令只接受列而不是表达式,所以这是非法的:

有任何解决方法吗?

谢谢!

0 投票
2 回答
5968 浏览

sql-server - MSSQL 上标量 UDF 中的 NULL 参数

如果参数为空,则标量 UDF(请参阅CREATE FUNCTION )的选项“RETURNS NULL ON NULL INPUT”会停止执行函数体并简单地返回 NULL。

也就是说,它短路了。

有谁知道它如何处理多个参数?

将具有多个参数的函数调用短路会很有用,例如第一个参数是否至少为 NULL。

当我有时间时,我将使用分析器来尝试跟踪 udf 调用。我已经搜索过,但找不到任何东西.. 更有可能我没有使用正确的搜索词。

同时,有没有人有任何想法或经验?

也欢迎来自其他 RDBMS 世界的答案。这是一个 ANSI 设置,我在搜索中看到了 DB2 和 MySQL 的结果

编辑,基于评论:仅适用于非 CLR 函数

干杯小号

编辑:我不需要运行探查器。嗬!这演示了以下行为:

0 投票
3 回答
1196 浏览

sql - 为什么 SQL 2005 说这个 UDF 是不确定的?

我有以下功能:

但...

返回(结果转置):

确定性 0

精确 1

IsSystemVerified 1

系统数据访问 0

用户数据访问 0

我尝试多次删除并重新创建该函数,以确保它不是一些缓存问题。CAST 在这里应该是确定性的,因为我将它用于字符串-> 整数。

我完全被难住了,有什么想法吗?

0 投票
1 回答
4490 浏览

sql - Oracle SQL:LEAST() 返回多行...?

一位同事刚刚带着一个令人费解的 SQL 查询来找我:

(本质上)

然而,返回的结果集列出了三个数字:

最少(id)
--------------
621
644
689

(所有都是符合查询的 ID,就好像它一起缺少 LEAST 函数一样)

为什么?=)