【发布时间】:2016-06-02 22:57:44
【问题描述】:
我对某事感到困惑。我正在使用 T-SQL 并尝试优化如下所示的代码:
SELECT * FROM MyTable mt
LEFT JOIN
(SELECT * FROM Table1 t1
LEFT JOIN api.tableValuedFunc(@someArgs) tvf
on tvf.Key = t1.Key) firstJoin
on mt.Key = firstJoin.key
LEFT JOIN
(SELECT * FROM Table2 t2
LEFT JOIN api.tableValuedFunc(@someArgs) tvf
on tvf.Key = t2.Key) secondJoin
on mt.Key = secondJoin.key
通过这样做:
declare @tvfResult TABLE ( ... some columns ... )
insert into @tvfResults SELECT * FROM api.tableValuedFunc(@someArgs);
SELECT * FROM MyTable mt
LEFT JOIN
(SELECT * FROM Table1 t1
LEFT JOIN @tvfResults tvf
on tvf.Key = t1.Key) firstJoin
on mt.Key = firstJoin.key
LEFT JOIN
(SELECT * FROM Table2 t2
LEFT JOIN @tvfResults tvf
on tvf.Key = t2.Key) secondJoin
on mt.Key = secondJoin.key
这使执行时间加倍!为什么是这样?在第二个例子中,我(天真地)假设我执行函数的频率是原来的一半。我正在破坏的幕后是否发生了某种 SQL 魔法?
【问题讨论】:
-
环顾四周,这似乎与stackoverflow.com/questions/4109152/… 有关,但这种情况下的处方是使用临时表,这就是我正在做的。
-
好的,显然这不是一个临时表,而是一个表变量,它慢了很多。不过,这一切都需要存在于一个函数中,所以我不能使用临时表。选项 #1 是否与我得到的一样快?
-
请确认您是否在测量的查询中实际使用“SELECT *”,或者只是在问题中使用它作为简写。请注意,由于任何覆盖索引不可用,仅使用“SELECT *”可能会严重影响性能。接下来,请附上来自 SSMS 的 ACTUAL QUERY PLAN 以供分析 - 如果没有查询计划或涉及的所有表/视图/等的完整 DDL,我们如何才能确定正在发生的事情?
标签: sql-server tsql