暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 用索引刷新物化视图

askTom 2017-03-22
348

问题描述

你好,

我们所有的MV都是通过nologging构建为完全可刷新,按需刷新的,如下所示:-

创建物化视图mv_name
NOLOGGING
表空间 “数据空间”
使用索引表空间 “INDEX_SPACE”
REFRESH ON DEMAND
COMPLETE
作为
-仅选择文本作为示例 (此SQL查询文本从CLOB列或CLOB过程的IN参数中动态填充,SELECT始终具有编译器提示,如图所示:

选择/*+ PARALLEL(8) NOLOGGING*/*
从tb_name_1
联盟
选择/*+ PARALLEL(8) NOLOGGING*/*
来自tb_name_2
;


创建MV并收集统计信息后,分析师开始使用MV,有时,根据性能和报告需求,我们可能必须在MV上的多个列上添加位图,唯一和非唯一索引。根据数据源自己的刷新时间表,每个MV可能具有不同的刷新时间表。

主要目标是建立一个 “精益” 刷新操作,尽可能多,这将有望导致刷新,这将花费最少的时间 (尽可能多,尽管由于SQL查询的性质,一些刷新将花费更长的时间等)。


在阅读DBMS_MVIEW.REFRESH的11.2文档后,它提到设置参数atomic_refresh => FALSE将负责 (a) 禁用,(b) 重建和 (c) 仅计算唯一索引的统计信息。

这是否意味着对于MV上存在的所有 “其他” 索引类型,例如位图和非唯一,我必须手动:-

(a) 在运行DBMS_MVIEW.REFRESH之前,禁用所有位图和非唯一索引 (忽略唯一索引),

(b) 使用参数运行DBMS_MVIEW.REFRESHmethod => 'C'atomic_refresh => FALSE,

(c) Rebuild all BITMAP和NON-UNIQUE indexes (hoping the UNIQUE indexes will be re-built in the step above),

(d) 收集表统计信息,以计算表以及所有索引的统计信息。


感谢任何建议 :)

专家解答

不,Oracle数据库刷新非唯一索引,并通过非原子刷新收集统计信息:

create table t2 ( x , y) as
  select rownum x, mod(rownum, 5) y from dual connect by level <= 1000;
create table t1 ( x , y) as
  select rownum x, mod(rownum, 3) y from dual connect by level <= 1000;
  
create materialized view mv_name
refresh on demand 
as
  select t1.* from t1
  union 
  select t2.* from t2;
  
create index iy on mv_name(y);

select status, num_rows from user_indexes
where  index_name = 'IY';

STATUS  NUM_ROWS  
VALID   1,800 
  
insert into t1
  select rownum+1000 x, mod(rownum, 3) y from dual connect by level <= 1000;
insert into t2
  select rownum+1000 x, mod(rownum, 5) y from dual connect by level <= 1000;
commit;

exec dbms_mview.refresh('mv_name', atomic_refresh => false);

select status, num_rows from user_indexes
where  index_name = 'IY';

STATUS  NUM_ROWS  
VALID   3,600   

select count(*) from mv_name;

COUNT(*)  
3,600   
复制


就使您的刷新速度更快而言,如果您可以定期进行快速刷新,则值得研究。你必须和工会一起去彻底刷新。但是你可以用union all快速刷新。(只需确保您添加了标记列:https://jonathanlewis.wordpress.com/2016/07/12/union-all-mv/)

所以你可以:

-创建快速刷新联合所有MV
-在此之上的完整刷新MV返回不同的行

如果两个表的交集为 “小”,这可能会有所帮助。如果是这样,则独特的MV处理的数据将少得多 => 它将更快。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论