Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

1

主题
1#
发表于 2013-4-13 12:06:31 | 查看: 3989| 回复: 3
oracle 10g数据库中创建一个基本的物化视图,比如:
create materialized view my_view
  enable query rewrite
as select owner,count(*) from big_table group by owner;

执行:
select count(*) from big_table where owner='SYS';
可以利用查询重写,删除基表部分数据:
delete from big_table where rownum<2;
commit;
select count(*) from big_table where owner='SYS';
不能利用查询重写。
想问问,oracle的cbo如何知道不能使用查询重写而使用全表扫描呢,也就是说,如何监控物化视图是否需要刷新。
多谢大家!

2#
发表于 2013-4-13 12:45:40
自己顶一个,查了查,我想是根据每个表的伪列ora_rowscn来控制的,不知道对不对。

回复 只看该作者 道具 举报

3#
发表于 2013-4-13 14:55:17
FYI

SQL> conn sh/oracle
已连接。


CREATE MATERIALIZED VIEW sum_sales_pscat_week_mv
ENABLE QUERY REWRITE AS
SELECT p.prod_subcategory, t.week_ending_day,
       SUM(s.amount_sold) AS sum_amount_sold
FROM   sales s, products p, times t
WHERE  s.time_id=t.time_id  AND s.prod_id=p.prod_id
GROUP BY p.prod_subcategory, t.week_ending_day;


SQL> explain plan for SELECT p.prod_subcategory, t.week_ending_day,
  2         SUM(s.amount_sold) AS sum_amount_sold
  3  FROM   sales s, products p, times t
  4  WHERE  s.time_id=t.time_id  AND s.prod_id=p.prod_id
  5  GROUP BY p.prod_subcategory, t.week_ending_day;

已解释。


SQL> /

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------
----------------------------------------
Plan hash value: 2350791048

--------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                    | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                         |  1879 | 92071 |     8   (0)| 00:00:01 |
|   1 |  MAT_VIEW REWRITE ACCESS FULL| SUM_SALES_PSCAT_WEEK_MV |  1879 | 92071 |     8   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------

已选择8行。

SQL> l
  1* select * from table(dbms_xplan.display())
  
  
  
  SQL> delete sales where rownum<1000;

已删除999行。

SQL> commit;

提交完成。

SQL> select STALENESS from dba_mviews where MVIEW_NAME='SUM_SALES_PSCAT_WEEK_MV';

STALENESS
--------------------------------------
STALE



SQL> conn sh/oracle
已连接。
SQL> exec dbms_mview.refresh('SUM_SALES_PSCAT_WEEK_MV','C');

PL/SQL 过程已成功完成。
   
   SQL> select STALENESS from dba_mviews where MVIEW_NAME='SUM_SALES_PSCAT_WEEK_MV'

STALENESS
--------------------------------------
FRESH







         
         
         

delete sales where rownum<1000;


SQL> alter session set events '10046 trace name context forever,level 8';

会话已更改。

SQL>  delete sales where rownum<1000;

已删除999行。

SQL> rollback;

回退已完成。

SQL> select STALENESS from dba_mviews where MVIEW_NAME='SUM_SALES_PSCAT_WEEK_MV';

STALENESS
--------------------------------------
FRESH

SQL> delete sales where rownum<1000;

已删除999行。

SQL> commit;

提交完成。

SQL> select STALENESS from dba_mviews where MVIEW_NAME='SUM_SALES_PSCAT_WEEK_MV';

STALENESS
--------------------------------------
NEEDS_COMPILE

SQL> select count(*) from SUM_SALES_PSCAT_WEEK_MV;

  COUNT(*)
----------
      4083

SQL>  select STALENESS from dba_mviews where MVIEW_NAME='SUM_SALES_PSCAT_WEEK_MV';

STALENESS
--------------------------------------
NEEDS_COMPILE



sys.sum$ w.mflags

   
alter session set events 'trace[SQL_MVRW] disk highest';
   
   
   
   

回复 只看该作者 道具 举报

4#
发表于 2013-4-15 10:31:12
谢谢ML,高论!

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-5-19 11:56 , Processed in 0.045271 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569