"缺少加入谓词"与COALESCE

时间:2015-06-02 12:22:52

标签: sql sql-server tsql coalesce

我遇到了一个查询运行时间非常长并且执行计划在问题点显示MISSING JOIN PREDICATE的情况。

以下是示例代码中的情况(实际代码太长而无法发布):

查询:

Select a, b, c
from table1 t1
join view v1
on t1.id = v1.id
join table3 t3
on v1.value = t3.value
...more joining...
where [where conditions here]

查看:

Select X, W, Coalesce(s1.value, s2.value, s3.value) as [value]
from table1 s1
left join table2 s2
on s1.id = s2.id
left join table3 s3
on s1.id = s3.id

所以我有一个使用视图的查询,该视图具有使用COALESCE创建的列。然后在查询中使用此合并列来连接到其他表等。

注意:我必须使用合并或类似的东西,因为我不知道哪个表(s1,s2或s3)将是非空的,因此用于此列的值

执行计划使用该合并视图列显示联接的MISSING JOIN PREDICATE。我假设它显示了这一点,因为合并代表了一个非确定性的值?

我尝试使用CTE重写查询或直接将查看代码添加到查询本身......但只要coalesce语句用于连接,我就会得到慢查询时间和MISSING加入预测。

我发现的唯一方法是使用临时表。我将视图结果加载到#Table中,然后在我的查询中加入#Table ...当我这样做时,它会在2-3秒内运行并返回73,000条记录。如果我使用查询/视图的第一个版本,它运行20+分钟。并杀死了tempdb。

我可以使用临时表版本,但有一些更优雅的方式来处理这种情况......希望所有这些都在一个查询中吗?

谢谢,

乔治

1 个答案:

答案 0 :(得分:0)

对视图进行连接通常表现不佳,因为表格并不存在(它只是SQL在需要时运行的存储查询)。我建议在子查询中使用视图中的select。优化器应该更容易使用它。

选择a,b,c
来自table1 t1
加入 (选择X,W,Coalesce(s1.value,s2.value,s3.value)为[value]
来自table1 s1
left join table2 s2
在s1.id = s2.id
left join table3 s3
在s1.id = s3.id)作为view1
在t1.id = v1.id
加入table3 t3
在v1.value = t3.value
...更多加入...
哪里[这里的条件]