为什么 物化视图PCT特性(2) 没有实施查询重写?
运行admin/utlxrw.sql脚本创建REWRITE_TABLE表。
指定单个物化视图
DBMS_MVIEW.EXPLAIN_REWRITE ( query VARCHAR2, --要解释的sql语句 mv VARCHAR2(30), --全限定物化视图名称(schema.mv),不指定为schema代表当前schema statement_id VARCHAR2(30));--客户端提供的用于区分输出信息的唯一标识指定多个物化视图
DBMS_MVIEW.EXPLAIN_REWRITE(query, 'mv1, mv2, mv3') --mv1,mv2,mv3为多个物化视图
使用DBMS_MVIEW.EXPLAIN_REWRITE,对sql进行解释,但并没有真正的执行。
SQL> DECLARE 2 qrytext VARCHAR2(500) :='select t2.name, sum(t1.value) from a_list t1,b t2 3 where t1.id=t2.id and t1.type=''a'' 4 group by t2.name'; 5 idno VARCHAR2(30) :='ID1'; 6 BEGIN 7 DBMS_MVIEW.EXPLAIN_REWRITE(qrytext, 'PMARKER_MV', idno); 8 END; 9 / PL/SQL 过程已成功完成。 SQL> SELECT message FROM rewrite_table ORDER BY sequence; MESSAGE ------------------------------------------------------------------------------------------------------------------------ QSM-01150: query did not rewrite QSM-01082: Joining materialized view, PMARKER_MV, with table, A_LIST, not possible QSM-01102: materialized view, PMARKER_MV, requires join back to table, A_LIST, on column, TYPEoracle要回表去找type字段信息,因此不能重写。设想使用pmarker的pct特性:如果两表中的分区表的分区键为连接字段,而在这时使用分区键做为谓词条件进行查询,则生效(此时 group by子句中的确不包含分区键)。
参考:
http://docs.oracle.com/cd/B19306_01/server.102/b14223/qradv.htm#sthref1495