SQL Server:加入2个查询,性能问题

时间:2014-04-25 13:11:02

标签: sql-server performance join

我有两个(相当复杂的)函数,它们都返回一个表;

(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秒。

有什么方法可以强制两个查询的结果组合使用的方式比每个查询的总和稍微多一点?

[更新]

  1. #TEMP;由于这是函数的一部分,遗憾的是#temp表不是一个选项。
  2. 我尝试过LEFT JOIN而不是JOIN而没有结果,似乎 FULL OUTER JOIN 解决了这个问题..
  3. 谢谢大家!

2 个答案:

答案 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