问题标签 [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.
asp.net - 如何编写用户定义函数?
我想把它写成用户定义的函数:
这可能与UDF有关吗?
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%
sql - 在多行上执行表值函数?
给定一个表值函数,例如dbo.Split()
来自"T-SQL: Opposite to string concatenation - how to split string into multiple records",我如何将多行作为参数传递?
这有效:
它返回:
但这不会:
这也不是:
文档说:
在子查询的 FROM 子句中调用返回表的用户定义函数时,函数参数不能引用外部查询中的任何列。
我正在寻找的那种结果集看起来像:
有没有办法(当然,除了光标)来完成这个?
(编辑)
根据 MarlonRibunal 的要求,生成上述结果的示例表如下所示:
id
是一个int
;myColumn
是一个varchar(max)
。
sql - 解决 UDF 性能问题 - 手动缓存
我的系统做了一些相当繁重的处理,我一直在攻击性能,以便让我能够在更短的时间内运行更多的测试运行。
我有很多情况下,UDF 必须被调用,比如说 500 万行(我几乎认为没有办法绕过它)。
好吧,事实证明,有一种方法可以解决这个问题,并且当通过一组比总行集小一些的不同参数调用 UDF 时,它可以显着提高性能。
考虑一个 UDF,它接受一组输入并返回基于复杂逻辑的结果,但是对于超过 5m 行的输入集,只有 100,000 个不同的输入,所以它只会产生 100,000 个不同的结果元组(我的特别从利率到复杂的代码分配,情况各不相同,但它们都是离散的——这种技术的基本点是,您可以通过运行SELECT DISTINCT
) 来简单地确定该技巧是否有效。
我发现通过这样做:
当 PreCalcs 被适当索引时,将其与:
你会在性能上获得巨大的提升。显然,仅仅因为某些东西是确定性的,并不意味着 SQL Server 正在缓存过去的调用并重新使用它们,正如人们可能认为的那样。
您唯一需要注意的是允许 NULL 的位置,然后您需要仔细修复连接:
希望这会有所帮助,并且欢迎使用 UDF 或重构查询以提高性能的任何类似技巧。
我想问题是,为什么这样的手动缓存是必要的——服务器不知道函数是确定性的吗?如果它产生了如此大的差异,并且如果 UDF 如此昂贵,那么优化器为什么不直接在执行计划中进行呢?
sql - 为什么 UDF 比子查询慢得多?
我有一个案例,我需要从同一个表中翻译(查找)几个值。我写它的第一种方式是使用子查询:
因为我经常使用这个子查询(也就是说,我有大约 50 个包含这些字段的表),我可能需要向子查询添加更多代码(例如, "AND active = 1" )我想我' d 将它们放入用户定义的函数UDF并使用它。但是使用该 UDF 的性能非常糟糕。
#1 的性能不到 1 秒。#2 的性能大约是 30 秒...
为什么,或者更重要的是,有什么方法可以在 SQL Server 2008 中编码,这样我就不必使用这么多子查询了?
编辑:
只是对何时有用的更多解释。当我想为用户获取文本时,这个简单的查询(即获取用户 ID)变得更加复杂,因为我必须加入个人资料才能获取语言,并与公司一起查看是否应该获取语言'而是从那里编辑,并使用翻译表来获取翻译后的文本。对于这些查询中的大多数,性能是可读性和可维护性的次要问题。
sql-server - 带有存储过程的 SQL 游标与带有 UDF 的查询
我正在尝试优化我正在维护的存储过程,并且想知道是否有人可以让我了解以下选项的性能优势/劣势。对于我的解决方案,我基本上需要对存储在表中的 IMAGE 列中的图像运行转换程序。转换过程位于外部 .EXE 文件中。这是我的选择:
将目标表的结果拉到一个临时表中,然后使用游标遍历表中的每一行并在 IMAGE 列上运行存储过程。存储过程调用.EXE。
创建一个调用 .EXE 文件的 UDF,并运行类似于“从 TargetTable 中选择 UDFNAME(Image_Col)”的 SQL 查询。
我想我正在寻找的是创建光标会增加多少开销的想法,而不是作为一个集合来做?
一些附加信息:
- 在这种情况下,集合的大小是最大值。1000
- 正如下面提到的答案,如果使用 UDF 作为一组完成,这是否意味着外部程序一次打开 1000 次?或者是否有针对此的优化?显然,在多处理器系统上,运行多个进程实例可能不是一件坏事,但 1000 个可能有点多。
sql-server - 基于应用于列的标量函数的索引
我有一个用户标量值函数,它接受 NVARCHAR(MAX) 并返回 NVARCHAR(MAX)。为了提高使用此功能的 GROUP BY 命令的性能,我想也基于它创建一个索引。但是文档说 CREATE INDEX 命令只接受列而不是表达式,所以这是非法的:
有任何解决方法吗?
谢谢!
sql-server - MSSQL 上标量 UDF 中的 NULL 参数
如果参数为空,则标量 UDF(请参阅CREATE FUNCTION )的选项“RETURNS NULL ON NULL INPUT”会停止执行函数体并简单地返回 NULL。
也就是说,它短路了。
有谁知道它如何处理多个参数?
将具有多个参数的函数调用短路会很有用,例如第一个参数是否至少为 NULL。
当我有时间时,我将使用分析器来尝试跟踪 udf 调用。我已经搜索过,但找不到任何东西.. 更有可能我没有使用正确的搜索词。
同时,有没有人有任何想法或经验?
也欢迎来自其他 RDBMS 世界的答案。这是一个 ANSI 设置,我在搜索中看到了 DB2 和 MySQL 的结果
编辑,基于评论:仅适用于非 CLR 函数
干杯小号
编辑:我不需要运行探查器。嗬!这演示了以下行为:
sql - 为什么 SQL 2005 说这个 UDF 是不确定的?
我有以下功能:
但...
返回(结果转置):
确定性 0
精确 1
IsSystemVerified 1
系统数据访问 0
用户数据访问 0
我尝试多次删除并重新创建该函数,以确保它不是一些缓存问题。CAST 在这里应该是确定性的,因为我将它用于字符串-> 整数。
我完全被难住了,有什么想法吗?
sql - Oracle SQL:LEAST() 返回多行...?
一位同事刚刚带着一个令人费解的 SQL 查询来找我:
(本质上)
然而,返回的结果集列出了三个数字:
最少(id)
--------------
621
644
689
(所有都是符合查询的 ID,就好像它一起缺少 LEAST 函数一样)
为什么?=)