【发布时间】:2015-11-06 15:41:00
【问题描述】:
我目前有一个视图可以根据相同的条件多次连接一个表,例如:
Select
m.ID,
a.value as value1,
b.value as value2,
c.value as value3,
d.value as value4
from
main_table m
left join other_table a on m.ID = a.ID and a.X = 'this'
left join other_table b on m.ID = b.ID and b.X = 'that'
left join other table c on m.ID = c.ID and c.X = 'third'
left join other table d on m.ID = d.ID and d.X = 'other'
我想知道将四个表合并并聚合它们是否更有效,这样我就可以在一个连接中完成所有操作:
Select
m.ID,
value1,
value2,
value3,
value4
from
main_table m
left join (select ID,
MAX(case X when 'this' then value end) value1,
MAX(case X when 'that' then value end) value2,
MAX(case X when 'third' then value end) value3,
MAX(case X when 'other' then value end) value4
from (
select ID,X,value from other_table
where X = 'this'
union all
select ID,X,value from other_table
where X = 'that'
union all
select ID,X,value from other_table
where X = 'third'
union all
select ID,X,value from other_table
where X = 'other')
GROUP BY ID) AS A
on A.ID = m.ID
我是在实验之前问的,因为实际上视图比这要复杂得多,并且需要很长时间才能重写,所以我想确保我没有浪费时间。
基本上,我的问题是执行聚合和group by 的成本是否会超过执行这些多个连接的成本。另外,我认为包含此视图包含 许多 个其他联接 (15-20) 的事实是相关的,因此我试图通过以任何方式减少该数量来进行优化。
编辑另外我觉得有必要补充一下,其中涉及链接服务器,这两个表位于不同的数据库上;我尝试减少连接数量的另一个原因。
任何见解或帮助将不胜感激。
提前致谢。
【问题讨论】:
-
查询是不同的,除非您可以保证在其他表中不超过一个匹配项。另外,“其他表”总是同一张表吗?
-
我可能会坚持第一个选项。如果您担心性能问题,请确保您在
X上有一个索引。您甚至可以为X的每个值添加一些过滤索引。 -
@GordonLinoff 怎么样?如果 ID 在另一个表中不存在,我不会得到
NULL的value吗? -
@Samcd 。 . .我措辞不正确。我的意思是不超过一个,至少一个。
-
@GordonLinoff 是的 other_table 始终是同一张表
标签: sql sql-server join optimization sql-server-2008-r2