SQL 服务器 - WHERE 条件下的函数调用
SQL Server - Function call in WHERE condition
我有一个关于在存储过程中 SELECT 语句的 WHERE 条件下进行函数调用的问题。这是模仿我的原始查询的示例查询。我在主 table 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 table 中有 300 万条记录,该函数是否被调用了 300 万次并影响了性能?
我的假设是 - WHERE 子句中的函数将在最终结果集上仅调用一次,以过滤结果。
我的问题是一次还是三百万次。顺便说一句-我的函数包含一个简单的 select 语句,内部连接到 2 tables,returns 一个数值。
相反,您可以这样做。将 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
我有一个关于在存储过程中 SELECT 语句的 WHERE 条件下进行函数调用的问题。这是模仿我的原始查询的示例查询。我在主 table 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 table 中有 300 万条记录,该函数是否被调用了 300 万次并影响了性能?
我的假设是 - WHERE 子句中的函数将在最终结果集上仅调用一次,以过滤结果。
我的问题是一次还是三百万次。顺便说一句-我的函数包含一个简单的 select 语句,内部连接到 2 tables,returns 一个数值。
相反,您可以这样做。将 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