sql - TSQL 有没有办法跳过 INNER JOIN 子句中函数的执行?

标签 sql function sql-server-2012 inner-join

我有以下 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/

相关文章:

mysql - 如何更改查询以使其更快?

php - 如何在mysql中复制列时插入数据?

python - 如何使用递归函数仅将全名列表中的名字应用于新列表

javascript - 优化JS函数按月份过滤数据

Swift 闭包和错误处理

sql-server - SQL Server 图表而不影响数据库的更改

c# - 如何进行时间间隔的计算?

sql-server - 从 SQL 复制到 RavenDB

c# - 如何处理 Entity Framework 上的 UpdateException - 'Violation of PRIMARY KEY constraint'?

Python使用sqlcmd执行sql查询