物化视图的测试例子如下:
SQL> Create Table test1 (a Number,b Number);
表已创建。
SQL> Insert Into test1 Values (1,1);
已创建 1 行。
SQL> Insert Into test1 Values (1,2);
已创建 1 行。
SQL> Insert Into test1 Values (1,3);
已创建 1 行。
SQL> Insert Into test1 Values (1,4);
已创建 1 行。
SQL> Insert Into test1 Values (2,1);
已创建 1 行。
SQL> Insert Into test1 Values (2,2);
已创建 1 行。
SQL> Insert Into test1 Values (2,3);
已创建 1 行。
SQL> Insert Into test1 Values (2,4);
已创建 1 行。
SQL> Commit;
提交完成。
SQL> Create Materialized View test1_mv
2Build Immediate
3Enable Query Rewrite
4As
5Select * From test1 x Where b=(Select Max(b) From test1 y Where x.a=y.a);
实体化视图已创建。
SQL> Commit;
提交完成。
SQL> Alter Session Set query_rewrite_enabled=True;
会话已更改。
SQL> analyze table test1 compute statistics
2for table
3 for all indexes
4 for all indexed columns;
表已分析。
SQL> set autotrace traceonly;
SQL>Select * From test1 x Where b=(Select Max(b) From test1 y Where x.a=y.a);
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=82 Bytes=2132
)
10 TABLE ACCESS (FULL) OF 'TEST1_MV' (Cost=1 Card=82 Bytes=21
32)
SQL>Select * From test1 x Where b=(Select Max(b) From test1 y Where x.a=y.a)
2 and a=1;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=9)
10 FILTER
21 TABLE ACCESS (FULL) OF 'TEST1' (Cost=1 Card=1 Bytes=9)
31 SORT (AGGREGATE)
43 TABLE ACCESS (FULL) OF 'TEST1' (Cost=1 Card=1 Bytes=9)
发现在包含子查询时,我加入其它WHERE条件就无法自动重写QUERY了?
觉得我的例子中的逻辑很简单,为什么ORACLE无法识别重写呢?
单层查询的到是每问题的。
最近看物化视图,还请大侠们指教。
|