新建了一个视图,是24张表的联合查询,基表上面都创建了查询字段的索引,视图有数据90W。现在问题是:查询这张表第一次很慢,需要20多秒,再次查询就很快了,为什么第一次查询视图会那么慢,有没有办法缩短查询时间?

解决方案 »

  1.   

    第一次执行同一个SQL的时候,都会比较慢一些,再次执行的时候,由于数据等还在内存内,会速度快很多。
    再者,在Oracle中,有共享SQL语句的机制,在第一次解析之后,  ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这样也会大大的提高效率。 
    建议用物化视图或用存储过程!
      

  2.   

    如果就用目前的解决方案,解决性能问题先判断视图的语句的where后的条件是否建有索引,没有的话,建立索引。判断视图涉及到的表的数据量,表增删改是否频繁。
    优化下视图查询语句,这个看情况而论。
      

  3.   

    为什么查询视图第一次会这么慢呢,如果我把这个视图中的数据插入到一个表中,查询也不需要这样长时间啊,而且是把shared_pool、buffer_cache、global context 都清理了。
      

  4.   

    SGA的好处就在于,如果执行两次相同的语句,第一次要比第二次慢很多
      

  5.   


        普通视图只是数据库中存的一条SQL语句,在运行的时候才执行视图的SQL,可以用存储过程实现,存储过程会预编译,如你所述,用表会更快,可用物化视图(Materialized View)
    示例为主键物化视图:              下面的语法在远程数据库表emp上创建主键物化视图        SQL> CREATE MATERIALIZED VIEW mv_emp_pk
                 REFRESH FAST START WITH SYSDATE 
                NEXT  SYSDATE + 1/48
                WITH PRIMARY KEY 
                AS SELECT * FROM emp@remote_db;   优化视图的SQL可以使用autotrace 功能查看执行计划
     
    SQL>set autotrace off  --默认为不打开
     
    SQL>set autotrace on  --查看执行计划和查询信息
     
    SQL>set autotrace traceonly --只显示执行计划,但不显示查询输出SQL>select ... from ... --你的查询语句
      

  6.   

    如果你真的是清理了buffer_cache,还是发现读视图的时间比插入表中的时间还要慢,那原因估计就是返回结果的时间太长,pl/sql中你可以看到,要把90W数据都显示出来,还是要一会的.
    PS:24张表关联出来的视图,这个设计肯定有问题.