普通视图只是数据库中存的一条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 ... --你的查询语句
再者,在Oracle中,有共享SQL语句的机制,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这样也会大大的提高效率。
建议用物化视图或用存储过程!
优化下视图查询语句,这个看情况而论。
普通视图只是数据库中存的一条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 ... --你的查询语句
PS:24张表关联出来的视图,这个设计肯定有问题.