我有这个:
SELECT
A
,B
,dbo.Func(C)
,dbo.Func(D)
,dbo.Func(E)
,F
FROM abcdef
WHERE
0 = dbo.Func(C) + dbo.Func(D)
我读过这不是一个好的做法,因为该函数被调用了数百万次,并且对性能产生了不良影响。
我试图用 CROSS APPLY 重写它:
SELECT *
FROM abcdef
CROSS APPLY dbo.Func(D) as FD
但它返回此错误:
Invalid object name 'dbo.Func'
我可以仅在 TABLE VALUED 函数上使用 CROSS APPLY 吗?
CROSS APPLY 是否适合标量函数(转换为表值函数)?因为在我的小型性能测试中,CROSS APPLY 有点慢。
虽然
CROSS APPLY
在某些情况下可能很有用,但我预计在特定情况下调用函数WHERE
之间的性能不会有任何差异。CROSS APPLY
如果表有一百万行(和列C
,D
可能还有一百万个不同的值),那么函数将被调用一百万次。不然怎么可能?就是这样:
或者:
同样,我认为这不会对效率产生任何影响。
标量 udf 可能会导致您的查询运行单线程。
请参阅 Ozar 关于此事的帖子。