我有以下 SQL 语句:
FUNCTION F1
INNER JOIN TABLE T1
INNER JOIN FUNCTION F2
INNER JOIN FUNCTION F3
INNER JOIN FUNCTION F4
...
INNER JOIN TABLE T2
在某些情况下,当 FUNCTION F1
没有返回任何记录时,整个语句将执行 12
秒。
FUNCTION F1
执行时间(单独)为 4
秒。
如果我只加入 FUNCTION F1
和表,执行时间又是 4
秒。
因此,SQL Server 正在执行其余的函数,这会增加语句的执行时间。
为什么 SQL Server 不跳过执行,因为存在 INNER JOIN
子句并且第一个函数不返回任何内容?有没有办法解决此问题?
最佳答案
SQL 引擎显然需要评估函数才能开始执行查询。如果有办法延迟它,我会感到惊讶。
一种选择是在运行查询之前进行检查:
select *
into #f1
from function f1;
if not exists (select 1 from #f1)
begin
-- stop processing here
end;
select *
into #f2
from function f2;
if not exists (select 1 from #f2)
begin
-- stop processing here
end;
select *
into #f3
from function f3;
if not exists (select 1 from #f3)
begin
-- stop processing here
end;
. . .
FUNCTION #F1
INNER JOIN TABLE T1
INNER JOIN #F2
INNER JOIN #F3
INNER JOIN #F4
...
INNER JOIN TABLE T2
这需要多个语句,但如果查询已经在存储过程中,则可能非常适合。
关于sql - TSQL 有没有办法跳过 INNER JOIN 子句中函数的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933583/