物化视图另外一个重要的特性为查询重写。查询重写的对象为普通查询语句。在查询语句中,Oracle总是搜寻from子句中所指定的数据源(表或视图)。查询重写是指,当进行查询时,Oracle改写查询语句,搜寻其他数据源,以在保证相同结果的情况下提高执行效率。而这个新的数据源,则往往是物化视图。
当然,使用查询重写,首先要启用物化视图的查询重写功能。例如,对于视图mv_object_count,启用查询重写功能的SQL语句如下所示。
SQL> alter materialized view mv_object_count enable query rewrite;
Materialized view altered
alter materialized view mv_object_count用于修改视图mv_object_count的属性;enable query rewrite则用于启用查询重写。
www.2cto.com
此时,查询表tmp_user_objects中各种数据库对象的个数,并利用PL/SQL Developer的执行计划查看执行过程细节,如图11-14所示。

图11-14 查询重写功能的执行细节
从图中可以看出,虽然在整个查询语句中,并未使用物化视图mv_object_count。但由于查询重写功能的存在,Oracle自动将数据查询的数据源指向了mv_object_count。此时,SQL语句执行的花费基数为2。
可以首先禁用查询重写功能,然后查看相同SQL语句的执行计划。
SQL> alter materialized view mv_object_count disable query rewrite;
Materialized view altered
disable query rewrite用于禁用mv_object_count的查询重写。而查询语句的执行计划如图11-15所示。
图11-15 禁用查询重写后的执行计划
在执行计划中可以看出,Oracle使用了from子句指定的查询对象--tmp_user_objects进行查询。查询语句的花费基数为4。
【示例11-24】 值得注意的是,并非与物化视图的查询定义完全相同的查询语句,才可以享有查询重写功能所带来的好处。
首先启用mv_object_count的查询重写功能。
SQL> alter materialized view mv_object_count enable query rewrite;
Materialized view altered
然后,通过利用SQL查询获得表tmp_object_count的记录总数,并在PL/SQL Developer的执行计划中查看,如图11-16所示。

图11-16 在执行计划中查看查询重写功能
Oracle在执行过程中,会发现利用物化视图mv_object_count可以获得相同的查询结果,并且更有效率,因此便使用了查询重写。这一切换过程是Oracle自动完成的,用户无须手动控制
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/241379/viewspace-752247/ ,如需转载,请注明出处,否则将追究法律责任。