百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

金仓数据库物化视图学习

wptr33 2025-02-07 19:20 26 浏览

1. 物化视图介绍

对于普通视图而言,数据会存储在基表中,这导致每次查询都相当于执行了视图定义的SELECT语句。对于物化视图而言,数据会进行单独存储,这导致物化视图的查询是对存储数据直接访问(省去了连接运算)。下面对KingbaseES物化视图的使用进行介绍。

2. CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW语句被用来创建一个物化视图。创建物化视图时可以指定物化视图的刷新方式,CREATE MATERIALIZED VIEW主要语法如下:

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name

[ (column_name [, ...] ) ]

[ USING method ]

[ WITH ( storage_parameter [= value] [, ... ] ) ]

[ TABLESPACE tablespace_name ]

AS query

[ WITH [ NO ] DATA ]

KingbaseES在Oracle模式可以指定刷新方式,并支持以下语法:

CREATE MATERIALIZED VIEW LOG ON table_name

[WITH {CTID | PRIMARY KEY | ROWID}]


CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name

[ (column_name [, ...] ) ]

[ USING method ]

[ WITH ( storage_parameter [= value] [, ... ] ) ]

[ TABLESPACE tablespace_name ]

[NEVER REFRESH |

REFRESH {[ FAST | COMPLETE | FORCE ] | ON {DEMAND | COMMIT} |

WITH {CTID | PRIMARY KEY | ROWID}}]

AS query

[ WITH [ NO ] DATA ]

需要注意的是,KingbaseES当前对commit刷新只做了语法兼容,并不支持其功能。

示例:创建简单的物化视图

--创建基表

create table base1(id int, name text);

create table base2(id int, birthday text);


--创建物化视图

CREATE MATERIALIZED VIEW mymatview AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id;


示例:在创建时填充数据

--基表插入数据

INSERT INTO base1 values(1,'TOM');

INSERT INTO base2 values(1,'2020-01-01');


--创建物化视图,填充数据

CREATE MATERIALIZED VIEW mymatview1 AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id;


--查询物化视图

Select * from mymatview1;


示例:创建时不填充数据,后续刷新物化视图填充

--创建物化视图,不填充数据

CREATE MATERIALIZED VIEW mymatview2 AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id with no data;


--查询物化视图

Select * from mymatview2;


--物化视图刷新后,可以正常显示数据

REFRESH MATERIALIZED VIEW mymatview2;

Select * from mymatview2;


示例:物化视图指定刷新方式

--创建物化视图,指定全量刷新

CREATE MATERIALIZED VIEW mymatview3 REFRESH COMPLETE AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id with no data;


--创建物化视图时,无物化日志时不能指定增量刷新

CREATE MATERIALIZED VIEW mymatview4 REFRESH Fast AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id;


--创建物化视图时,指定默认的刷新方式

CREATE MATERIALIZED VIEW mymatview4 REFRESH FORCE AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id;


--当前创建物化视图时, 不支持commit的刷新方式

CREATE MATERIALIZED VIEW mymatview5 REFRESH ON COMMIT FORCE AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id;


--创建物化视图,指定DEMAND刷新

CREATE MATERIALIZED VIEW mymatview5 REFRESH ON DEMAND FORCE AS SELECT base1.id id,name,birthday FROM base1, base2 where base1.id = base2.id;



3. REFRESH MATERIALIZED VIEW

在上面的示例中,我们已经创建了物化视图,当基表数据发生变化时,物化视图就需要刷新,否则就无法获取物化视图中的数据。物化视图的刷新命令为REFRESH MATERIALIZED VIEW,具体语法如下:

REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name

[ WITH [ NO ] DATA ]

示例:基表数据变化后,物化视图将不可见

--对基表添加数据

INSERT INTO base1 values(2,'john');

INSERT INTO base2 values(2,'2021-01-01');


--未刷新时查询物化视图,发现数据没有同步更新

Select * from mymatview1;


--刷新后,新插入的数据可以获取

REFRESH MATERIALIZED VIEW mymatview1;

Select * from mymatview1;


--使用with no data刷新,将导致视图无法被访问

REFRESH MATERIALIZED VIEW mymatview1 with no data;

Select * from mymatview1;


相关推荐

高性能并发队列Disruptor使用详解

基本概念Disruptor是一个高性能的异步处理框架,是一个轻量的Java消息服务JMS,能够在无锁的情况下实现队列的并发操作Disruptor使用环形数组实现了类似队列的功能,并且是一个有界队列....

Disruptor一个高性能队列_java高性能队列

Disruptor一个高性能队列前言说到队列比较熟悉的可能是ArrayBlockingQueue、LinkedBlockingQueue这两个有界队列,大多应用在线程池中使用能保证线程安全,但其安全性...

谈谈防御性编程_防御性策略

防御性编程对于程序员来说是一种良好的代码习惯,是为了保护自己的程序在不可未知的异常下,避免带来更大的破坏性崩溃,使得程序在错误发生时,依然能够云淡风轻的处理,但很多程序员入行很多年,写出的代码依然都是...

有人敲门,开水开了,电话响了,孩子哭了,你先顾谁?

前言哎呀,这种情况你肯定遇到过吧!正在家里忙活着,突然——咚咚咚有人敲门,咕噜咕噜开水开了,铃铃铃电话响了,哇哇哇孩子又哭了...我去,四件事一起来,人都懵了!你说先搞哪个?其实这跟我们写Java多线...

面试官:线程池如何按照core、max、queue的执行顺序去执行?

前言这是一个真实的面试题。前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core、max、queue的执行循序去执行?"。我们都知道线程池中代码执行顺序是:co...

深入剖析 Java 中线程池的多种实现方式

在当今高度并发的互联网软件开发领域,高效地管理和利用线程资源是提升程序性能的关键。Java作为一种广泛应用于后端开发的编程语言,为我们提供了丰富的线程池实现方式。今天,就让我们深入探讨Java中...

并发编程之《彻底搞懂Java线程》_java多线程并发解决方案详解

目录引言一、核心概念:线程是什么?...

Redis怎么实现延时消息_redis实现延时任务

一句话总结Redis可通过有序集合(ZSET)实现延时消息:将消息作为value,到期时间戳作为score存入ZSET。消费者轮询用ZRANGEBYSCORE获取到期消息,配合Lua脚本保证原子性获取...

CompletableFuture真的用对了吗?盘点它最容易被误用的5个场景

在Java并发编程中,CompletableFuture是处理异步任务的利器,但不少开发者在使用时踩过这些坑——线上服务突然雪崩、异常悄无声息消失、接口响应时间翻倍……本文结合真实案例,拆解5个最容易...

接口性能优化技巧,有点硬_接口性能瓶颈

背景我负责的系统到2021年初完成了功能上的建设,开始进入到推广阶段。随着推广的逐步深入,收到了很多好评的同时也收到了很多对性能的吐槽。刚刚收到吐槽的时候,我们的心情是这样的:...

禁止使用这5个Java类,每一个背后都有一段"血泪史"

某电商平台的支付系统突然报警:大量订单状态异常。排查日志发现,同一笔订单被重复支付了三次。事后复盘显示,罪魁祸首竟是一行看似无害的SimpleDateFormat代码。在Java开发中,这类因使用不安...

无锁队列Disruptor原理解析_无锁队列实现原理

队列比较队列...

Java并发队列与容器_java 并发队列

【前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一。本文主要阐述Java并发包下的阻塞队列和并发容器,其实研读过大数据相关技术如Spark、Storm等源码的,...

线程池工具及拒绝策略的使用_线程池处理策略

线程池的拒绝策略若线程池中的核心线程数被用完且阻塞队列已排满,则此时线程池的资源已耗尽,线程池将没有足够的线程资源执行新的任务。为了保证操作系统的安全,线程池将通过拒绝策略处理新添加的线程任务。...

【面试题精讲】ArrayBlockingQueue 和 LinkedBlockingQueue 区别?

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准...