如何優化以下T-SQL
的性能,因此heavyFunctionCall
函數只會被調用一次。在WHERE子句中重用字段值
在表變量,臨時表,CTEsor其他東西中尋找最快的選項?
SQL:
select dbo.heavyFunctionCall(a, b, c)
from T
where dbo.heavyFunctionCall(a, b, c) > 10
如何優化以下T-SQL
的性能,因此heavyFunctionCall
函數只會被調用一次。在WHERE子句中重用字段值
在表變量,臨時表,CTEsor其他東西中尋找最快的選項?
SQL:
select dbo.heavyFunctionCall(a, b, c)
from T
where dbo.heavyFunctionCall(a, b, c) > 10
這樣做只會對每一行運行函數一次,而不是兩次:
SELECT *
FROM (
SELECT dbo.heavyFunctionCall(a, b, c) AS x
FROM T) a
WHERE x > 10
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
也許這樣的:
select hFC.result
from T
cross apply (select dbo.heavyFunctionCall(T.a, T.b, T.c) result) hFC
where hFC.result > 10
你試過查看你描述的各種選項的查詢計劃? – 2015-02-24 11:47:18
我沒有。我對TSQL的認識是膚淺的。我認爲我可以自然地使用來自選擇的字段,而不是在那裏。 – user1514042 2015-02-24 11:48:33