我有两个(相当复杂的)函数,它们都返回一个表;
(SELECT Id, x, y FROM fnGetXY(3)) (execution takes +/- 5 sec)
(SELECT Id, a, b FROM fnGetAB(3)) (execution takes +/- 15 sec)
我想结合结果;
SELECT X.Id, x, y, a, b FROM
(
(SELECT Id, x, y FROM fnGetXY(3)) X
JOIN (SELECT Id, a, b FROM fnGetAB(3)) Y ON X.Id=Y.Id
)
结果是正确的,但这不会花费预期的+/- 20-25秒,而是90秒。
有什么方法可以强制两个查询的结果组合使用的方式比每个查询的总和稍微多一点?
[更新]
谢谢大家!
答案 0 :(得分:1)
在大多数情况下,解决方案是将中间结果保存到#temp表中,然后加入结果:
select Id, x, y
into #t1
from fnGetXY(3)
select Id, a, b
into #t2
from fnGetAB(3)
SELECT #t1.Id, x, y, a, b
FROM #t1
INNER JOIN #t2 on #t1.id = #t2.id
SQL Server优化器并不像处理函数那样(内联TVF除外)。
答案 1 :(得分:0)
你应该可以加入这两个函数,就像加入两个表一样,我认为这些子查询只是一个相当简单的查询的过度杀伤。尝试类似....
SELECT t1.Id
, t1.x
, t1.y
, t2.a
, t2.b
FROM fnGetXY(3) t1 INNER JOIN fnGetAB(3) t2
ON t1.Id = t2.Id