我有一个关于在我的存储过程中在SELECT语句的WHERE条件中进行函数调用的问题。这是我的模拟原始的示例查询。我在主表CDP的生产数据库中有300万条记录。我担心的是在我的WHERE子句中使用函数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 ( testFunction(@UserId) = 0
OR (UR.ID IS NOT NULL AND UR.CDPUserId = @UserId))
GROUP BY C.AwardId, C.ProgramName
我的问题是 - 是否为结果集中的每条记录调用了该函数?由于CDP表中有300万条记录,该功能是否被称为300万次并影响性能?
我的假设是 - WHERE子句中的函数仅在最终结果集上被调用,以过滤结果。
它是ONCE还是300万次是我的问题。 BTW - 我的函数包含一个简单的select语句,内部连接到2个表,并返回一个数值。
答案 0 :(得分:1)
相反,你可以做到这一点。将function
结果分配给variable
并在where
子句
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