![]() |
1
26
在大多数情况下,最好避免使用引用表的标量值函数,因为(如其他人所说)它们基本上是黑盒,每行需要运行一次,并且不能由查询计划引擎优化。因此,即使相关表具有索引,它们也倾向于线性缩放。 您可能需要考虑使用一个内联表值函数,因为它们是用查询内联计算的,并且可以进行优化。您可以得到所需的封装,但可以在select语句中正确粘贴表达式。 作为内联的副作用,它们不能包含任何过程代码(no declare@variable;set@variable=;return)。但是,它们可以返回若干行和列。 您可以这样重新编写函数:
使用它们的语法也略有不同:
|
![]() |
2
6
他们没有。 标量函数中没有导致性能指数级下降的bug,这取决于对标量函数执行的行数。再次尝试您的测试,并查看SQL事件探查器、CPU、读取和持续时间列。增加测试大小以包括耗时超过一秒、两秒、五秒的测试。
产量
请记住,如果对结果集中的行运行标量函数,则每行执行一个标量函数,而不进行全局优化。 |
![]() |
3
3
|
![]() |
4
2
对结果集中的每一行调用函数两次(对数据库进行两次选择命中)。 要使您的查询更快地连接到地理信息系统的位置并跳过以下功能:
我不知道为什么我只是从问题中抄袭了nolock或crazy where子句… |
![]() |
5
0
简单地说,因为具有用户定义函数的SQL表达式比没有它们的SQL表达式效率低。无法优化执行逻辑;必须为每一行产生函数开销(包括调用协议)。 凯米克的建议很好。哪里。。in(select something)不太可能是一个有效的模式,在这种情况下,可以很容易地用join替换。 |
![]() |
6
0
看看这是否更有效…或者是一个明显的内部连接?
至于标量函数的性能,我不确定。 |
![]() |
7
0
通常,标量函数比内联TVF对应函数慢得多。幸运的是,在许多情况下,它都会改变。 将引入SQL Server 2019 Scalar UDF Inlining :
检查功能是否不可输入:
在数据库级别启用/禁用功能:
|
![]() |
Community wiki · SQL语法新手 1 年前 |
![]() |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |