在WHERE子句中重用字段值

时间:2015-02-24 11:45:38

标签: tsql where sql-server-2014

如何优化以下T-SQL的效果,以便heavyFunctionCall函数只调用一次。

寻找表变量,临时表,CTEs或其他东西中最快的选项吗?

SQL:

select dbo.heavyFunctionCall(a, b, c) 
from T 
where dbo.heavyFunctionCall(a, b, c) > 10

3 个答案:

答案 0 :(得分:3)

这样做只会在每一行上运行一次而不是两次:

SELECT * 
FROM (
  SELECT dbo.heavyFunctionCall(a, b, c) AS x
  FROM T) a
WHERE x > 10

答案 1 :(得分:1)

declare proc tst (@x int)  -- set @x whatever you want.
                           -- the execution plan will be the same.
as 
begin
SELECT * 
FROM (
  SELECT dbo.heavyFunctionCall(a, b, c) AS result
  FROM T) resultx
WHERE result > @x
end

答案 2 :(得分:1)

也许这个:

select hFC.result
from T 
cross apply ( select dbo.heavyFunctionCall(T.a, T.b, T.c) result ) hFC
where hFC.result > 10