如何使用Oracle SQL Join提高性能

时间:2011-10-14 07:30:08

标签: sql oracle join oracle11g database-performance

情况是我必须加入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加入,性能很糟糕。

3 个答案:

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

有时subselectleft outer join效率更高,您应该记住的是where子句过滤器中的限制性更强。正如Guffa所说,添加索引是一个很好的观点。但请记住,如果您在表中添加的索引远远超过读取writes,那么它可能会减慢该表的updates/insert