CROSS APPLY für die Skalarfunktion


7

Ich habe das:

SELECT
A
,B
,dbo.Func(C)
,dbo.Func(D)
,dbo.Func(E)
,F
FROM abcdef
WHERE
0 = dbo.Func(C) + dbo.Func(D)

Ich habe gelesen, dass dies keine gute Praxis ist, da die Funktion millionenfach aufgerufen wird und sich negativ auf die Leistung auswirkt.

Ich habe versucht, es mit CROSS APPLY neu zu schreiben:

SELECT *
 FROM abcdef
  CROSS APPLY dbo.Func(D) as FD

aber es gibt diesen Fehler zurück:

Invalid object name 'dbo.Func'

Kann ich CROSS APPLY nur für TABLE VALUED-Funktionen verwenden?

Und ist CROSS APPLY überhaupt für Skalarfunktionen (konvertiert in Tabellenwertfunktionen) geeignet? Denn bei meinem kleinen Leistungstest ist CROSS APPLY etwas langsamer.

Antworten:


13

Ich habe gelesen, dass dies keine gute Praxis ist, da die Funktion als "zilion" -Zeiten bezeichnet wird und sich negativ auf die Leistung auswirkt.

Obwohl CROSS APPLYdies in einigen Fällen nützlich sein kann, erwarte ich keinen Leistungsunterschied zwischen dem Aufrufen der Funktion im WHEREoder CROSS APPLYim speziellen Fall. Wenn die Tabelle eine Million Zeilen (und Spalten Cund Dmöglicherweise eine Million verschiedene Werte) enthält, wird die Funktion millionenfach aufgerufen. Wie kann es anders sein?

Ich habe versucht, es mit umzuschreiben CROSS APPLY.

Hier ist wie:

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 ;

oder:

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 ;

Auch hier denke ich nicht, dass dies Auswirkungen auf die Effizienz haben wird.


Vielen Dank, über die Leistung, es wurde erwähnt, dass, wenn Sie die Ausgabe der Funktion mehr als eine verwenden müssen. In einer anderen Spalte zum BeispielSELECT ca.Fc, ca.Fc + ca.Fd
Muflix
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.