2015-02-24 98 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