情况是我必须加入10多个不同的表。在SQL我加入同一个表5次。查询看起来像这样。
select * from
Tab1
join Tab2 on Tab1.x = Tab2.x
.
.
.
join Tab10 t10 on
t10.x = 'xx' and
t10.y = 'yy' and
t10.z = 'zz'
join Tab10 t11 on
t11.x = 'aa' and
t11.y = 'bb' and
t11.z = 'cc'
join Tab10 t12 on
t12.x = 'dd' and
t12.y = 'ee' and
t12.z = 'ff'
join Tab10 t13 on
t13.x = 'gg' and
t13.y = 'hh' and
t13.z = 'ii'
join Tab10 t14 on
t14.x = 'jj' and
t14.y = 'kk' and
t14.z = 'll'
此Tab10连接5次的原因是根据参数获取不同的值。是否有可能以更好的方式重写Tab10加入? 我也注意到由于这个Tab10加入,性能很糟糕。
答案 0 :(得分:1)
您无需加入5次,而是使用or
。
.
.
.
join Tab10 t10 on
(t10.x = 'xx' and t10.y = 'yy' and t10.z = 'zz') or
(t10.x = 'aa' and t10.y = 'bb' and t10.z = 'cc') or
(t10.x = 'dd' and t10.y = 'ee' and t10.z = 'ff') or ...
答案 1 :(得分:0)
进行一些连接并不一定意味着性能不佳。使用您在连接中使用的三个字段为Tab10表创建索引。
请勿使用select *
,否则会降低性能。您将获取许多不使用的数据。
答案 2 :(得分:0)
有时subselect
比left outer join
效率更高,您应该记住的是where
子句过滤器中的限制性更强。正如Guffa所说,添加索引是一个很好的观点。但请记住,如果您在表中添加的索引远远超过读取writes
,那么它可能会减慢该表的updates/insert
。