oracle多表联合查询作为一张视图,查询速度超~级~慢~的,怎么办?

create or replace view v_shipowner_all_test as
select a.owner_id shipowner_id,a1.ship_count,a1.ship_count_s,a1.ship_count_s_cgt,a2.new_ship_ty,a2.new_ship_ty_s,a3.new_ship_ly,a3.new_ship_ly_s
from so_shipowner_info a
left join (select t.ship_owner_id,count(1) ship_count,nvl(sum(t.dwt),0) ship_count_s,nvl(sum(t.cgt),0) ship_count_s_cgt from ship_base_info t group by t.ship_owner_id)a1 on a1.ship_owner_id=a.owner_id
left join (select t.ship_owner_id,count(1) new_ship_ty,nvl(sum(t.dwt),0) new_ship_ty_s from order_info_new t where t.contract_date>to_char(sysdate,'yyyy') group by t.ship_owner_id)a2 on a2.ship_owner_id=a.owner_id
left join (select t.ship_owner_id,count(1) new_ship_ly,nvl(sum(t.dwt),0) new_ship_ly_s from order_info_new t where t.contract_date>to_char(ADD_MONTHS(sysdate,-12),'yyyy') and t.contract_date<to_char(ADD_MONTHS(sysdate,-12),'yyyy-mm-dd') group by t.ship_owner_id)a3 on a3.ship_owner_id=a.owner_id
group by a.owner_id,a1.ship_count,a1.ship_count_s,a1.ship_count_s_cgt,a2.new_ship_ty,a2.new_ship_ty_s,a3.new_ship_ly,a3.new_ship_ly_s
这只是一部分,一共50多个表,想做一张大视图.结果发现,查询了一个晚上也没有查询出结果,怎么样才能提高查询速度呢?或者有什么其他解决办法?????

表之间连接的字段创建联合索引了么?另外连接条件的先后顺序也很重要。那个连接条件可以过滤掉不符合条件的数据那个字段连接条件应该在最后。如果数据量比较大,而且对数据的实时性要求不高,那么建议用oracle的物化视图来做。物化视图是介于普通视图和表之间的一种oracle专有对象,物化视图会将查询的数据缓存起来,同时可以对物化视图进行修改、查询、删除和添加操作。而且可以设置物化视图定时更新,但是定时的时间一定要大于数据查询的时间。追问

谢谢,我再问一下.表之间没有建立联合索引,最终视图一共223个字段,大约来自60个联合查询,建立索引的话会提高效率吗?现在对数据的实时性最低要求是每周更新一次,可以使用物化视图吗?如果建立物化视图,现在是先统计结果,再联合查询.之前做的是先联合查询,再统计结果.这两个哪个更有效呢?

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-02
先学习“索引”的知识,然后优化查询,给必要的查询字段建立索引。
这个东西一个回答是说不清的,自己慢慢学习吧。
相似回答