Oracle-day03 中
二、物化视图
(一)什么是物化视图 视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。 物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。 (二)创建物化视图语法 CREATE METERIALIZED VIEW view_name [BUILD IMMEDIATE | BUILD DEFERRED ] REFRESH [FAST|COMPLETE|FORCE] [ ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT (next_time) AS subquery BUILD IMMEDIATE 是在创建物化视图的时候就生成数据 语句: create materialized view mv_address as select ad.id,ad.name adname,ar.name ar_name from t_address ad,t_area ar where ad.areaid=ar.id 执行上边的语句后查询
这时,我们向地址表(T_ADDRESS)中插入一条新记录,
begin DBMS_MVIEW.refresh(‘MV_ADDRESS‘,‘C‘); end; 或者通过下面的命令手动刷新物化视图:
create materialized view mv_address2 refresh on commit as select ad.id,t_area ar where ad.areaid=ar.id 创建此物化视图后,当 T_ADDRESS 表发生变化时,MV_ADDRESS2 自动跟着改变。 create materialized view mv_address3 build deferred refresh on commit as select ad.id,t_area ar where ad.areaid=ar.id; 创建后执行下列语句查询物化视图
执行下列语句生成数据 begin DBMS_MVIEW.refresh(‘MV_ADDRESS3‘,‘C‘); end; 再次查询,得到结果: 由于我们创建时指定的 on commit,所以在修改数据后能立刻看到最新数据,无须再次执行 refresh create materialized view log on t_address with rowid; create materialized view log on t_area with rowid 创建的物化视图日志名称为 MLOG$_表名称 create materialized view mv_address4 refresh fast as select ad.rowid adrowid,ar.rowid arrowid,ad.id,ad.name adname,t_area ar where ad.areaid=ar.id; 注意:创建增量刷新的物化视图,必须:
begin DBMS_MVIEW.refresh(‘MV_ADDRESS4‘,‘C‘); end; 三、序列
CREATESEQUENCEsequence //创建序列名称 [INCREMENT BYn]//递增的序列值是 n如果 n是正数就递增,如果是负数就递减 默 认是 1 [STARTWITHn]//开始的值,递增默认是 minvalue递减是 maxvalue [{MAXVALUEn |NOMAXVALUE}]//最大值 [{MINVALUEn |NOMINVALUE}]//最小值 [{CYCLE| NOCYCLE}]//循环/不循环 [{CACHEn |NOCACHE}];//分配并存入到内存中 (四)案例 create sequence seq_test1 increment by 10 start with 10 maxvalue 300 minvalue 20 以上的错误,是由于我们的开始值小于最小值 。开始值不能小于最小值,修改 以上语句: create sequence seq_test1 increment by 10 start with 10 maxvalue 300 minvalue 5 我们执行下列语句提取序列值,当序列值为 300(最大值)的时候再次提取值, 2.有最大值的循环序列 create sequence seq_test2 increment by 10 start with 10 maxvalue 300 minvalue 5 cycle ; 当序列当前值为 300(最大值),再次提取序列的值
由此我们得出结论,循环的序列,第一次循环是从开始值开始循环,而第二次循 环是从最小值开始循环。 思考问题: 下列语句是否会报错?为什么? create sequence seq_test3 increment by 10 start with 10 minvalue 5 cycle ; 答:此为错误的语句。因为你创建的是一个循环的序列,所以必须指定最大值, create sequence seq_test3 increment by 10 start with 10 maxvalue 300 minvalue 5 cycle cache 50; 我们执行上边语句的意思是每次取出 50 个缓存值,但是执行会提示错误 上边错误提示的意思是:缓存设置的数必须小于每次循环的数。 我们缓存设定的值是 50,而最大值是 300,那么为什么还会提示这样的信息呢? 其实我们的 cache 虽然是 50,但是我们每次增长值是 10。这样 50 次缓存提取出 的数是 500 (50*10) 我们更改为下列的语句: create sequence seq_test4 increment by 10 start with 10 maxvalue 500 minvalue 10 cycle cache 50; 下列语句依然会提示上边的错误,这是因为还存在一个 minvalue ,minvalue 和 create sequence seq_test5 increment by 10 start with 10 maxvalue 500 minvalue 9 cycle cache 50; 把最小值减 1,或把最大值加 1,都可以通过。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |