我遇到了一个查询运行时间非常长并且执行计划在问题点显示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。
我可以使用临时表版本,但有一些更优雅的方式来处理这种情况......希望所有这些都在一个查询中吗?
谢谢,
乔治
答案 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
...更多加入...
哪里[这里的条件]