使用物化视图刷表

Posted by Vincent on November 14, 2008

基本步骤,以备查询

原始数据表

create table mv_test(i number);

declare
i integer;
begin
for i in 1 .. 10000 loop
insert into mv_test values(i);
end loop;
commit;
end;

1. 建表

create table mv_test_2(i number); --不要使用create table.. as .. 会丢失默认值

2. 建物化视图日志

如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

所以呢,在原来的表上需要一个主键
alter table mv_test
add constraint pk_mv_test_i primary key (i)using index tablespace users;

CREATE MATERIALIZED VIEW LOG ON mv_test;

3. 创建物化视图
CREATE MATERIALIZED VIEW mv_test_2
ON PREBUILT TABLE
REFRESH FAST ON DEMAND
AS
SELECT * FROM mv_test;

4. 全刷

EXEC DBMS_MVIEW.REFRESH('mv_test_2', 'COMPLETE');5. 增量快刷

EXEC DBMS_MVIEW.REFRESH('mv_test_2','FAST');

**. 当然一般的增量快刷是放在数据库job或者crontab中滴

CREATE OR REPLACE PROCEDURE SP_REFRESH_MV AS
BEGIN
DBMS_MVIEW.REFRESH('MV_TEST_2','FAST');
END;
/

建jobs,5分钟刷新一次

variable jobno number;
variable instno number;
begin
select instance_number into :instno from v$instance;
dbms_job.submit(:jobno, 'SP_REFRESH_MV;', sysdate, 'sysdate+5/1440', TRUE, :instno);
commit;
end;
/

接下来就是建索引等等的操作,就可以将新的表mv_test_2替换mv_test,并将相应的权限还原。
完成之后把job、存储过程删除

记得分析表!!!

 

以前滴关于物化视图的文章

http://hi.baidu.com/dbaeyes/blog/item/9137e70a9535fe1d95ca6be6.html

http://hi.baidu.com/dbaeyes/blog/item/47ded144f6f58580b2b7dcac.html

http://hi.baidu.com/dbaeyes/blog/item/4b533fc2a0925e37e5dd3b93.html

--- http://hi.baidu.com/rublis/blog/item/e6dd514c8007f7fdd72afc56.html

-- http://hi.baidu.com/luanjy/blog/item/30a6af0fba886deaab6457e0.html

在dbms_mview.refresh中启用并行刷新 http://zhaolinjnu.blog.sohu.com/80240169.html

--EOF--


This work is licensed under a CC A-S 4.0 International License.