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
先学习“索引”的知识,然后优化查询,给必要的查询字段建立索引。
这个东西一个回答是说不清的,自己慢慢学习吧。

oracle多表联合查询作为一张视图,查询速度超~级~慢~的,怎么办?_百度...
如果数据量比较大,而且对数据的实时性要求不高,那么建议用oracle的物化视图来做。物化视图是介于普通视图和表之间的一种oracle专有对象,物化视图会将查询的数据缓存起来,同时可以对物化视图进行修改、查询、删除和添加操作。而且可以设置物化视图定时更新,但是定时的时间一定要大于数据查询的时间。

Oracle 视图查询有的时候很慢,有的时候查询很快
这种情况有很多可能性,首先,你的服务器的负载情况会影响到你的数据读取速度的,如果数据库服务器执行的进程过多,会导致查询速度下降很多。另外,第一次执行同一个SQL的时候,都会比较慢一些,再次执行的时候,由于数据等还在内存内,会速度快很多。再者,在Oracle中,有共享SQL语句的机制,在第一次解析...

视图超慢,要十几秒才出结果.求优化方法,在线等...
另外补充一点,视图本身就会造成效率低,因为视图存的是sql定义,当执行查询的时候 数据库会先上磁盘上查询视图定义 再利用视图定义查询数据,这样就产生了至少两次磁盘i\/o,oracle中有物化视图的概念,SqlServer中应该也有,如果我的改善计划还不能达到你的要求的话,建议考虑一下。--- 以上,希望对你...

oracle数据库约200W数据查询非常慢,查询需要10几秒,经常查询超时,这个...
先确认一下问题,是代码操作的查询还是连接oracle工具操作的查询,优化大数据量主要先从三两方式入手,第一,建索引,这个有讲究:主要是针于你的查询条件(即是在where后面的字段建索引,有几个条件字段就建几个,如果有组合条件查询,那建联合索引)。第二点,就是按表中的数据,进行表分区,如按时间...

oracle单表查询超慢
该表曾经有过大量数据,然后被DELETE过,但是表空间并未释放,并且未对表进行分析处理,所以表的统计信息不对,可尝试TRUNCATE这张表,或者对这张表进行收缩处理

一张普通的oracle表过20亿数据,truncate table 执行都,超时,怎么处理...
那么就用where1=2建立一个空白新表,然后drop掉原表,然后再把新表改回原来的表名就可以了,如果要建立索引什么的直接建立就好。当然还有一个办法,就是get_ddl找到原来的建表语句,也可以通过这个找到相关的其他语句(比如约束,索引等),然后drop掉表,然后利用语句重新建立表就可以了。

一张oracle的表,大概2千万行的数据,如何快速(要优化,我现在用sql自带的...
1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;...

oracle怎样区分表和视图
通过sql语句查询就可以。Select object_name From user_objects Where object_type='VIEW'; --查看所有视图 Select object_name From user_objects Where object_type='TABLE'; --查看所有表另外,可以用plsql等工具来查看:tables就是表,view就是视图。

在ORACLE中怎么对LONG类型字段的模糊查询
12.根据Oracle的建议,应该避免再使用LONG类型。如果可能应该使用TO_LOB来重建表,将表中的LONG类型转化为CLOB或BLOB类型。13.这里就不考虑这种方法了,只是讨论一下对于不能重建的表如何进行查询。14.如果表中的数据长度不超过32K的话,可以考虑通过类似下面的PL\/SQL代码来实现:15.SQL> SET SERVEROUT ...

跪求一个超难的ORACLE数据纵向存储转成横向查询输出
--先建立四个表,并向表中插入数据 create table temp_bd_sbtz_gg (sbbh varchar2(20),sbmc varchar2(20),lxbh varchar2(20))insert into temp_bd_sbtz_gg values('1','所内变压器','101');insert into temp_bd_sbtz_gg values('2','真空断路器','102');insert into temp_bd_...

相似回答