标量函数的交叉应用

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在某些情况下可能很有用,但我不希望在特定情况下WHERECROSS APPLY在特定情况下调用函数之间的性能有任何差异。如果表有一百万行(和列CD可能有一百万个不同的值),该函数将被调用一百万次。不然怎么可能?

我试图用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)

同样,我认为这不会对效率产生任何影响。