Muf*_*lix 8 sql-server cross-apply
我有这个:
SELECT
A
,B
,dbo.Func(C)
,dbo.Func(D)
,dbo.Func(E)
,F
FROM abcdef
WHERE
0 = dbo.Func(C) + dbo.Func(D)
Run Code Online (Sandbox Code Playgroud)
我读过这不是一个好的做法,因为该函数被调用了数百万次并且对性能产生了不良影响。
我试图用 CROSS APPLY 重写它:
SELECT *
FROM abcdef
CROSS APPLY dbo.Func(D) as FD
Run Code Online (Sandbox Code Playgroud)
但它返回此错误:
Invalid object name 'dbo.Func'
Run Code Online (Sandbox Code Playgroud)
我可以只在 TABLE VALUED 函数上使用 CROSS APPLY 吗?
CROSS APPLY 是否适用于标量函数(转换为表值函数)?因为在我的小型性能测试中,CROSS APPLY 有点慢。
ype*_*eᵀᴹ 13
我读到这不是一个好习惯,因为函数被称为“zilion”次并且它对性能有不良影响。
虽然CROSS APPLY
在某些情况下可能很有用,但我不希望在特定情况下WHERE
或CROSS APPLY
在特定情况下调用函数之间的性能有任何差异。如果表有一百万行(和列C
,D
可能有一百万个不同的值),该函数将被调用一百万次。不然怎么可能?
我试图用
CROSS APPLY
.
就是这样:
SELECT
t.A,
t.B,
ca.Fc,
ca.Fd,
dbo.Func(t.E) AS Fe
t.F,
FROM abcdef AS t
CROSS APPLY
( SELECT
dbo.Func(t.C) AS Fc,
dbo.Func(t.D) AS Fd
) AS ca
WHERE 0 = ca.Fc + ca.Fd ;
Run Code Online (Sandbox Code Playgroud)
或者:
SELECT
...
FROM abcdef AS t
CROSS APPLY
( SELECT
dbo.Func(t.C) AS Fc,
dbo.Func(t.D) AS Fd
FROM (SELECT NULL) AS dummy
WHERE 0 = dbo.Func(t.C) + dbo.Func(t.d)
) AS ca ;
Run Code Online (Sandbox Code Playgroud)
同样,我认为这不会对效率产生任何影响。