Oracle进阶(2)——物化视图案例延伸以及序列、同义词

2024-04-23 11:36

本文主要是介绍Oracle进阶(2)——物化视图案例延伸以及序列、同义词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、物化视图

        物化视图(Materialized View)是 Oracle 数据库中的一个对象,它是一个预先计算和存储的查询结果集,类似于视图,但与视图不同的是,物化视图会将查询结果保存在物理存储中,而不是动态计算结果。这样可以提高查询性能,特别是对于复杂的查询或者包含聚合函数的查询。物化视图在创建时可以指定刷新方式,可以是手动刷新或自动刷新。自动刷新的物化视图会在底层表发生改变时自动更新,而手动刷新的物化视图需要手动触发刷新操作。物化视图通常用于提高查询性能,减少复杂查询的执行时间,特别是在数据仓库等需要频繁进行聚合查询或者数据汇总的场景中。

注意:以下案例图标关系如下:

1、物化视图----手动刷新、自动刷新、延时生成数据

-- todo 1 需求:查询地址 ID,地址名称和所属区域名称 t_address t_area
-- 创建手动更新的物化视图(默认)
-- create materialized view 视图名
-- build immediate
-- refresh force on demand
create materialized view te1
build immediate
refresh force on demand
as
select T_ADDRESS.ID, T_ADDRESS.NAME, T_AREA.NAME area
from T_ADDRESSinner join T_AREA on T_ADDRESS.AREAID = T_AREA.ID;
-- 查询视图
select * from te1;
-- 向 t_address添加数据 (8,'宏福苑小区',1,1) 查看是否同步数据
insert into t_address values(8,'宏福苑小区',1,1);
commit;
-- 这里需要手动刷新 begin dbms_mview.refresh('te1') end;
begindbms_mview.refresh('te1');
end;-- todo 2 创建自动更新的物化视图
-- 需求:查询地址 ID,地址名称和所属区域名称 t_address t_area
-- create materialized view 视图名
-- build immediate
-- refresh force on commit
create materialized view te2
build immediate
refresh force on commit
as
select T_ADDRESS.ID, T_ADDRESS.NAME, T_AREA.NAME area
from T_ADDRESSinner join T_AREA on T_ADDRESS.AREAID = T_AREA.ID;
-- 查看视图
select * from te2;
-- 向 t_address添加数据 (9,'龙旗2区',1,1) 查看是否同步数据
insert into t_address values(9,'龙旗2区',1,1);
commit;
-- 查看视图
select * from te2;-- todo 3 创建不生成数据的物化视图 bulid deferred(延时生成数据)
-- 需求:查询地址 ID,地址名称和所属区域名称 t_address t_area
-- create materialized view 视图名
-- build deferred
-- refresh force on commit
create materialized view test1
build deferred
refresh force on commit
asselect T_ADDRESS.ID, T_ADDRESS.NAME, T_AREA.NAME area
from T_ADDRESSinner join T_AREA on T_ADDRESS.AREAID = T_AREA.ID;
-- 查看数据
select * from C##WATERUSER.test1;
-- 刷新后生成数据
beginDBMS_MVIEW.REFRESH('test1');
end;

2、物化视图----增量手动更新

-- todo 6. 创建增量更新物化视图
-- 需求:查询地址 ID,地址名称和所属区域名称 t_address t_area
-- 注意:
-- 1. 创建增量更新物化视图 所有的源数据表 必须有物化视图日志
-- 2. 创建的增量更新物化视图 中 必须包含 源数据表中的rowid-- 创建物化视图日志
create materialized view log on T_ADDRESS with rowid;
create materialized view log on T_AREA with rowid;
-- 查看t_address的日志 MLOG$_T_ADDRESS
select * from MLOG$_T_ADDRESS;
-- 向t_address表插入数据 (10,'幸福社区',1,1)
delete from T_ADDRESS where id=10;
insert into T_ADDRESS values (10,'幸福社区',1,1);
commit;
-- 查看t_address的日志 MLOG$_T_ADDRESS
select * from MLOG$_T_ADDRESS;
-- 创建增量更新手动刷新表
-- create materialized view test2
-- build immediate
-- refresh fast on demand
-- as
-- select
--         T_ADDRESS.ROWID as addr_rowid,
--         T_AREA.ROWID as area_rowid,
--         T_ADDRESS.ID, T_ADDRESS.NAME, T_AREA.NAME area
-- from T_ADDRESS
-- inner join T_AREA on T_ADDRESS.AREAID = T_AREA.ID;
create materialized view test2
build immediate
refresh fast on demand
as
selectT_ADDRESS.ROWID as addr_rowid,T_AREA.ROWID as area_rowid,T_ADDRESS.ID, T_ADDRESS.NAME, T_AREA.NAME area
from T_ADDRESS
inner join T_AREA on T_ADDRESS.AREAID = T_AREA.ID;
-- 向t_address表中增加数据(11, '德国公馆', 1, 1)
insert into t_address values (11, '德国公馆', 1, 1);
commit;
-- 查看T_ADDRESS表数据
select * from T_ADDRESS;
-- 查看视图数据(非select方式查看)
select * from test2;
-- 手动刷新 begin DBMS_MVIEW.REFRESH('view_test_', METHOD =>'f'); end;
beginDBMS_MVIEW.REFRESH('view_test_11', METHOD =>'f');
end;

3、物化视图----全量自动更新

-- todo 1 需求: 查询地址 ID,地址名称和所属区域名称
-- create materialized 视图名
-- build immediate
-- refresh complete on commit
create materialized view test3
build immediate
refresh complete on commit
as
selectT_ADDRESS.ID, T_ADDRESS.NAME, T_AREA.NAME area
from T_ADDRESS
inner join T_AREA on T_ADDRESS.AREAID = T_AREA.ID;
-- 向t_address表添加数据(12, '德黑兰', 1, 1)
insert into t_address values (12, '德黑兰', 1, 1);
commit;
-- 查询 t_address表 数据
select * from T_ADDRESS;
-- 查询视图
select * from C##WATERUSER.test3;
-- todo 2 删除视图
drop materialized view test3;
-- todo 3 删除视图日志
drop materialized view log on 数据表名;

二、序列

1、序列含义

        在 Oracle 中,序列(Sequence)是一种数据库对象,用于生成唯一的数字序列。序列通常用于为表的主键字段或其他需要唯一标识的字段提供自增的值。

2、使用案例

2.1、 创建序列

2.1.1、创建简单序列

CREATE SEQUENCE employee_id_seqSTART WITH 1001INCREMENT BY 1NOCACHENOCYCLE;
  • employee_id_seq 是序列的名称。
  • START WITH 1001 指定序列的起始值为 1001。
  • INCREMENT BY 1 指定序列每次增加的步长为 1。
  • NOCACHE 表示不缓存序列号,每次都从数据库获取。
  • NOCYCLE 表示不循环,当达到最大值后不会重新从最小值开始。

创建序列语法:

create sequence  序列名称

通过序列的伪列来访问序列的值

NEXTVAL 返回序列的下一个值

CURRVAL 返回序列的当前值

注意:我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。

提取下一个值

select 序列名称.nextval from dual

提取当前值

select 序列名称.currval from dual

2.1.2、创建复杂序列:

CREATE SEQUENCE sequence  //创建序列名称

[INCREMENT BY n]  //递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默认是 1

[START WITH n]     //开始的值,递增默认是 minvalue 递减是 maxvalue

[{MAXVALUE n | NOMAXVALUE}] //最大值

[{MINVALUE n | NOMINVALUE}] //最小值

[{CYCLE | NOCYCLE}] //CYCLE和NOCYCLE 表示当序列的值达到限制值后是否循环。CYCLE代表循环即到达例如最大值后重新从最小值开始

[{CACHE n | NOCACHE}];//定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

2.2、使用序列

SELECT employee_id_seq.NEXTVAL FROM dual;

2.3、序列与表的关联

        通常,序列会与表的主键字段关联,以确保每次插入新记录时都能为主键生成唯一的值。例如,假设有一个名为 employees 的表,其中有一个 employee_id 字段作为主键:

CREATE TABLE employees (employee_id NUMBER PRIMARY KEY,first_name VARCHAR2(50),last_name VARCHAR2(50),...
);

可以在表创建时指定序列的默认值:

CREATE TABLE employees (employee_id NUMBER DEFAULT employee_id_seq.NEXTVAL PRIMARY KEY,first_name VARCHAR2(50),last_name VARCHAR2(50),...
);

        这样,在插入新记录时,如果不提供 employee_id 的值,数据库会自动使用序列来为其生成唯一的值。

2.4、序列的管理

--修改序列
ALTER SEQUENCE employee_id_seq INCREMENT BY 2;--删除数列
DROP SEQUENCE employee_id_seq;

三、同义词

1、什么是同义词

        同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以 及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的 SQL 语句复杂度。

        同义词允许基对象重命名或者移动,这时,只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。你可以创建公共同义词和私有同义词。其中,公共同义词属于 PUBLIC 特殊  用户组,数据库的所有用户都能访问;而私有同义词包含在特定用户的方案中,只允许特定用户或者有基对象访问权限的用户进行访问。

        同义词本身不涉及安全,当你赋予一个同义词对象权限时,你实质上是在给同义词的基对象赋予权限,同义词只是基对象的一个别名。

2、创建与使用同义词

创建同义词的具体语法是: 

create [public] SYNONYM synooym for object;

        其中 synonym 表示要创建的同义词的名称,object 表示表,视图,序列等我们要创建同义词的对象的名称。

3、同义词使用案例

3.1、私有同义词

需求:为表 T_OWNERS  创建( 私有 )同义词 名称为 OWNERS

语句:

create synonym owners for t_owners;

使用同义词:

select * from owners;

3.3、公有同义词

需求:为表 T_OWNERS  创建(  公有 )同义词 名称为 OWNERS2:

create public synonym owners2 for t_owners;

以另外的用户登陆,也可以使用公有同义词:

select * from owners2;

案例

-- 1 需求:为表 T_AREA  创建( 私有 )同义词 名称为 AREA

-- 2 需求:为表 T_AREA  创建( 共有 )同义词 名称为 AREA2

-- 3 验证 其他用户

实现

-- 1 需求:为表 T_AREA  创建( 私有 )同义词 名称为 AREA
create synonym area for t_area;
select * from area;-- 2 需求:为表 T_AREA  创建( 共有 )同义词 名称为 AREA2
create public synonym area2 for t_area;-- 3 验证
select * from area2;

这篇关于Oracle进阶(2)——物化视图案例延伸以及序列、同义词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/928672

相关文章

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注