如何优化以下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