SQL server – functionsaufruf im WHERE-Zustand

Ich habe eine Frage zum Erstellen eines functionsaufrufs in WHERE Bedingung einer SELECT-statement in meiner gespeicherten Prozedur. Hier ist meine Musterabfrage, die mein Original nachahmt. Ich habe 3 Millionen datasätze in der Produktionsdatenbank für Primärtabelle CDP. Mein Anliegen ist, wenn es irgendwelche Performance Auswirkungen der Verwendung der function testFunction (@UserId) in meiner WHERE-Klausel wäre.

SELECT C.AwardId, C.ProgramName, Count(ClientId) as Intakes FROM CDP C LEFT JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId LEFT JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId WHERE (1=1) -- here I've other filtering criteria for the results AND ( testFunction(@UserId) = 0 OR (UR.ID IS NOT NULL AND UR.CDPUserId = @UserId)) GROUP BY C.AwardId, C.ProgramName 

Meine Frage ist – Wird die function für jeden datasatz in der Ergebnismenge aufgerufen? Da gibt es 3 Millionen datasätze in CDP-Tabelle, wird die function 3 Millionen Mal genannt und Auswirkungen auf die performance?

Meine Annahme ist, dass – die function in WHERE-Klausel NUR ONCE auf die endgültige Ergebnismenge genannt werden, um die Ergebnisse zu filtern.

Wird es einmal oder 3 Millionen mal meine Frage sein. BTW – meine function enthält eine einfache select-statement mit inneren Joins zu 2 Tabellen und gibt einen numerischen Wert zurück.

Stattdessen können Sie dies tun. Weisen Sie das function einer variable und verwenden Sie es in where Klausel

 declare @check int, select @check = dbo.testFunction(@UserId) SELECT C.AwardId, C.ProgramName, Count(ClientId) as Intakes FROM CDP C LEFT JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId LEFT JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId WHERE (1=1) -- here I've other filtering criteria for the results AND ( @check = 0 OR (UR.ID IS NOT NULL AND UR.CDPUserId = @UserId)) GROUP BY C.AwardId, C.ProgramName