大学老师直接跳过的视图,没曾想面试居然问了
大学时因为课程较赶,老师把视图的章节跳过了,让我一度以为基本没用,等到入了职才知道原来有用到。
为了找到面试的感觉,前几天专门投了简历,没想到还问了物化视图。还好看过,不然就尴尬了。
普通视图
视图可以理解为一张表或多张表的预计算,这些表称为基表。
它可以将所需要查询的结果封装成一张虚拟表,基于它创建时指定的查询语句返回的结果集。
视图具有以下特点:
- 安全性:只将需要的结果呈现出来,查询者不知道具体用了哪些表或哪些字段,因此比较安全;
- 屏蔽复杂性:下层计算可能做了很多复杂的关联操作,只需要让开发者将其实现,将结果以视图呈现给使用者。
如何创建普通视图
CREATE [OR REPLACE] VIEW view [(alias[, alias]...)] AS subquery [WITH READ ONLY];
例如:
create view v_emp as select * from emp where deptno = 30;
物化视图
对于普通视图而言,其真实数据在基表中,即每次查询视图都是需要执行查询语句。
有时候为了防止每次都查询,将结果集存储起来,这种有真实数据的视图,称为物化视图。
什么情况下适合用物化视图?
基表没有很多 DML,且每次查询都需要耗费较大资源的情况下,可以考虑用物化视图。
物化视图的创建是这样的:
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 创建物化视图的时候就生成数据,默认方式;
BUILD DEFERRED 创建时不生成数据,以后根据需要再生成。理解为创建一个空的视图。
② REFRESH:当基表发生 DML 操作后,物化视图何时采用哪种方式和基表同步数据。
REFRESH 后面跟着的刷新方法有:FAST、COMPLETE、FORCE。
FAST:增量刷新,只刷新自上次刷新以后进行的修改。
COMPLETE:对整个物化视图进行完全的刷新,相当于先 truncate 再 insert。
FORCE:默认的刷新方式。刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。
③ 刷新的模式有两种:ON DEMAND 和 ON COMMIT。默认为 ON DEMAND
ON DEMAND 需要手动刷新物化视图。
ON COMMIT 在基表发生 COMMIT 操作时刷新。
增量刷新是如何判断哪些记录被改动的?
通过对基表建立物化视图日志,就可以监测到基表的变动。
每当基表有变动的时候就会往对应的物化视图日志中写入数据。
当进行 Fast 刷新的时候,物化视图日志中的改动就会写入到物化视图中,这样就实现了增量刷新。
物化视图创建案例
create materialized view my_materialized refresh complete on demand start with sysdate next to_date(concat(to_char(sysdate + 1,'dd-mm-yyyy'),'00:03:00'),'dd-mm-yyyy hh24:mi:ss') as select * from user_info;
这个物化视图表示从当前日期开始,往后每天 00:03 进行全量覆盖刷新。
如果觉得对你有帮助,或者觉得还行的话,麻烦动动小手点个小赞。
转载请注明出处 【大数据的奇妙冒险】
#面试##大数据##数据库#写点大数据相关的内容,一起交流进步