2015-02-24 97 views
2

如何优化以下T-SQL的性能,因此heavyFunctionCall函数只会被调用一次。在WHERE子句中重用字段值

在表变量,临时表,CTEsor其他东西中寻找最快的选项?

SQL:

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

你试过查看你描述的各种选项的查询计划? – 2015-02-24 11:47:18

+0

我没有。我对TSQL的认识是肤浅的。我认为我可以自然地使用来自选择的字段,而不是在那里。 – user1514042 2015-02-24 11:48:33

回答

3

这样做只会对每一行运行函数一次,而不是两次:

SELECT * 
FROM (
    SELECT dbo.heavyFunctionCall(a, b, c) AS x 
    FROM T) a 
WHERE x > 10 
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 
1

也许这样的:

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