logo
GBase 8s
其他
文章

南大通用GBase 8s物化视图:数据管理的加速器

路路路
发表于2024-12-04 17:07:29280次浏览0个评论

GBase 8s数据库系统的ORACLE模式,提供了物化视图数据管理工具,能够留存逻辑查询的快照数据,从而极大地提升数据检索的速度和效率。今天,我们就来讨论GBase 8s中物化视图的入门知识,以及如何利用这一功能优化我们的数据库性能。

注意:该功能仅在 GBase 8s 的 ORACLE 模式下支持。

物化视图的创建

创建物化视图时常用的选项如下所示:

create materialized view 物化视图名      --创建物化视图
build [immediate | deferred ]           --创建方式,默认 immediate
refresh「force | fast| complete ]       --物化视图刷新方式,默认 force
on  [commit | demand]                   --刷新触发方式
start with 开始时间                      --设置开始时间
next 间隔时间                            --设置间隔时间
as subquery ;                            --查询语句

语法解释说明:

1.创建 build的方式

(1) immediate: 创建物化视图的同时立即生成数据,默认。

(2) deferred: 延迟至第一次 refresh 时才生效

2.刷新的方式

(1) force :强制刷新,默认。

(2) fast : 快速刷新。只刷新‘增量’部分 (前提:创建物化日志)

(3) complete: 当物化视图刷新时会根据查询语句生成的数据进行全量刷新

3.刷新时机

(1) on commit: 基表有 commit 动作时,刷新刷图;

(2) on demand: 按需刷新,用户可以手动刷新,也可通过 START WITH 和 NEXT 指定时间自动刷新;

START WITH ... [ NEXT ...]

[1] START WITH ... 用户指定物化视图的首次刷新时间,NEXT ...指定下一次刷新时间,后者与前者的时间间隔就是自动刷新的间隔频率;

[2]如果指定 START WITH 省略 NEXT 则首次刷新后不再自动刷新;

[3]如果省略 START WITH 指定 NEXT 则使用当前系统时间与下一次刷新时间的间隔作为刷新间隔;

[4]如果 START WITH 和 NEXT 均未指定则物化视图不会自动刷新。

物化视图的刷新

执行refresh materialized view 物化视图名,完成物化视图的刷新。

REFRESH MATERIALIZED VIEW 物化视图名 「force | fast | complete ] ;

手动刷新物化视图时,可指定刷新方式。请注意若指定 fast 刷新,基础表必须建有物化视图日志。

物化视图的删除

DROP MATERIALIZED VIEW 物化视图名;

当删除一个物化视图时,也会删除依赖于此物化视图的任何其它视图。

示例:创建全量刷新物化视图

示例数据库版本为:GBase8sV8.8_3.5.1

--创建基础表
set environment sqlmode 'oracle';
create table emp(id int primary key, name varchar2(20),sex varchar(1),sal number(32,0),deptid int, job varchar2(50),hiredate date);
create table dept(deptid int primary key,deptname varchar2(30),mig int);
--1. build immediate 全量刷新物化视图
create MATERIALIZED VIEW mv01 build immediate
refresh complete on demand
as select d.deptname, e.name,e.sal
from emp e,dept d
where d.deptid=e.deptid order by e.id;

--立即生成数据
> select * from mv01;



DEPTNAME  研发一部
NAME      张三
SAL       12000
ID        101

DEPTNAME  研发一部
NAME      李四
SAL       9000
ID        102

2 row(s) retrieved.

--2. build deferred全量刷新物化视图
create MATERIALIZED VIEW mv02(deptname,empname,empsal)
build deferred refresh complete
on demand
as select d.deptname, e.name,e.sal
from emp e,dept d
where d.deptid=e.deptid order by e.id;

--延迟刷新数据,mv02 此刻没有记录
> select * from mv02;


DEPTNAME                       EMPNAME                        EMPSAL


No rows found.

--3. 再次更新数据
insert into emp values(103,'王五',1,14300,2,'售后','2019-08-12');
insert into emp values(104,'何明',1,6700,2,'销售','2019-02-02');
insert into emp values(105,'刘津京',1,8900,3,'测试','2019-07-02');

--查看物化视图,数据没有刷新
> select * from mv02;


DEPTNAME                       EMPNAME                        EMPSAL


No rows found.

> select * from mv01;



DEPTNAME  研发一部
NAME      张三
SAL       12000
ID        101

DEPTNAME  研发一部
NAME      李四
SAL       9000
ID        102

2 row(s) retrieved.

--4. 手动刷新物化视图
REFRESH MATERIALIZED VIEW mv01;
REFRESH MATERIALIZED VIEW mv02 complete;
--此时,物化视图已刷新
>  select * from mv01;

DEPTNAME  研发一部
NAME      张三
SAL       12000
ID        101

DEPTNAME  研发一部
NAME      李四
SAL       9000
ID        102

DEPTNAME  销售部
NAME      王五
SAL       14300
ID        103

DEPTNAME  销售部
NAME      何明
SAL       6700
ID        104

DEPTNAME  测试部
NAME      刘津京
SAL       8900
ID        105

5 row(s) retrieved.

> select * from mv02;

DEPTNAME                       EMPNAME                        EMPSAL

研发一部                   张三                          12000
研发一部                   李四                           9000
销售部                      王五                          14300
销售部                      何明                            6700
测试部                      刘津京                        8900

5 row(s) retrieved.

定时刷新物化视图示例

--创建基础表
set environment sqlmode 'oracle';
drop table if exists emp;
drop table if exists dept;
create table emp(id int primary key, name varchar2(20),sex varchar(1),sal number(32,0),deptid int, job varchar2(50),hiredate date);
create table dept(deptid int primary key,deptname varchar2(30),mig int);
--创建刷新物化视图,每一分钟刷新一次
create MATERIALIZED VIEW mv03 build immediate
refresh complete on demand
start with sysdate
next sysdate + 1/1440
as select d.deptname, e.name,e.job
from emp e,dept d
where d.deptid=e.deptid order by e.id;

--插入数据
insert into emp values(101,'张三',1,12000,1,'研发工程师','2019-09-02');
insert into emp values(102,'李四',0,9000,1,'研发工程师','2019-09-22');
insert into dept values(1,'研发一部',101);
insert into dept values(2,'销售部',103);
insert into dept values(3,'测试部',null);
--此时查询mv03 返回 0 rows
> select * from mv03;

No rows found.
--1 分钟侯查询,mv03 数据已刷新
> select * from mv03;

DEPTNAME  研发一部
NAME      张三
JOB       研发工程师
ID        101

DEPTNAME  研发一部
NAME      李四
JOB       研发工程师
ID        102

2 row(s) retrieved.

删除物化视图

DROP MATERIALIZED VIEW mv01;
DROP MATERIALIZED VIEW mv02;
DROP MATERIALIZED VIEW mv03;

物化视图是GBase 8s提供的工具,不仅可以提高查询性能,还可以简化数据管理。通过合理地创建和刷新物化视图,我们可以确保数据的一致性和实时性,同时减少数据库的负载。感谢您的阅读,有问题可以与我们联系,让我们一起探索GBase 8s物化视图的更多可能。

评论

登录后才可以发表评论