背景:在项目中需做两个系统间的数据对接,原本方案是做视图,但测试后发现即使在同一局域网内查询性能仍不理想。应用中需要做频繁的查询和统计,所以考虑试试物化视图,希望兼顾高效的查询以及定时的自动数据同步。
当然决定做物化视图前可对视图的查询做执行计划分析下瓶颈在哪。
基本概念:
(1) 物化视图在某种意义上说就是一个 物理表(而且不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到确认;(2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;(3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证;创建语句:create materialized view mv_name as select * from table_name因为物化视图由于是物理真实存在的,故可以创建索引。
主要参数:
语法:
create materialized view view_name
refresh [ fast|complete|force ]
[
on [commit|demand ] |
start with (start_time) next (next_time)]AS subquery;
创建物化视图需要的权限:grant create materialized view to user_name;在源表建立物化视图日志:create materialized view log on test_tabletablespace test_space -- 日志空间with primary key; -- 指定为主键类型在目标数据库上创建MATERIALIZED VIEW:create materialized view mv_materialized_test refresh force on demand start with sysdate nextto_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 10:25:00'),'dd-mm-yyyy hh24:mi:ss') asselect * from user_info; --这个物化视图在每天10:25进行刷新修改刷新时间:alter materialized view mv_materialized_test refresh force on demand start with sysdatenext to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');或alter materialized view mv_materialized_test refresh force on demand start with sysdatenext trunc(sysdate,'dd')+1+1/24; -- 每天1点刷新
建立索引:create index IDX_MMT_IU_TESTon mv_materialized_test(ID,UNAME)tablespace test_space;
删除物化视图及日志:drop materialized view log on test_table; --删除物化视图日志:drop materialized view mv_materialized_test; --删除物化视图
查看系统中所有物化视图的刷新时间:
select refresh_method,refresh_mode,staleness,last_refresh_type,last_refresh_date from user_mviews;
常见问题
ORA—01723:不允许长度为0的列 把值为null的字段,改为 cast('' as varchar2(100)),避免创建列时不能明确字段类型。