实体化视图

2023-11-13

Oracle 的实体化视图是包括一个查询结果的数据库对像,它是远程数据的本地副本,或者用来
生成基于数据表求和的汇总表。实体化视图存储基于远程表的数据,也可以称为快照。
实体化视图可用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,
就可以避免这些耗时的操作,而从快速地得到结果。实体化视图在很多方面和索引相类似:使用
实体化视图的目的是为了提高查询性能;实体化视图对应用透明,增加和删除实体化视图不会影
响应用程序中 SQL 语句的正确性和有效性;实体化视图需要占用存储空间;当基表发生变化时,
实体化视图也应当同步刷新。

创建实体化视图示例
建立完全更新的视图需要用户具有 connect, resource 和 create materialized view
权限,如果需要激活 query rewrite, 则还需要授予 global query writer 权限(或针对
涉及的表单独授权)

1. 以 dba 身份创建用户并进行授权:

SQL>conn / as sysdba 

SQL>grant connect to mtest;

SQL>grant resource to mtest;

SQL>grant create materialized view to mtest;

SQL>grant global query rewrile to mtest;

2. 创建表空间 MV_DATA 用于存放实体化视图和相关日志:

SQL>create tablespace MV_DATA datafile '+DATA' size 1G

    2   autoextend on next 2M maxsize 2G;

3. 建立测试用的基础表:

SQL>conn mtest/mtest

SQL>create table person(id int primary key, name varchar(50),

    2   deptid int not null);

SQL>create table dept(id int primary key, name varchar(50));

4. 插入测试数据:

SQL>insert into person (id, name, deptid) values(1, 'hr' , 100);

SQL>insert into person (id, name, deptid) values(2, 'scott', 101);

SQL>insert into dept (id, name) values(100, 'sales');

SQL>insert into dept (id, name) values(101, 'opert');

二、主键实体化视图
1. 创建 person 表的实体化视图日志:

SQL>CREATE MATERIALIZED VIEW LOG ON person;

2. 创建实体化视图,采用从当前开始的快速刷新方式,刷新间隔 1 分钟:

SQL>create materialized view mv_per_pk tablespace MV_DATA

    2   refresh fast start with sysdate

    3   next sysdate + 1/24/62

    4   with primary key

    5   as select * from person;

3. 查看实体化视图的数据:

SQL>select * from mv_per_pk;

4. 插入新的数据:

SQL>insert into person (id, name, deptid) values(3, 'tiger', 103);

SQL>commit;

5. 等待一分钟后查看实体化视图,新插入的数据已经刷新:

三、Rowid 实体化视图
1. 创建 Rowid 实体化视图,默认采用 ON DEMAND 刷新模式:

SQL>create materialized view mv_per_rowid tablespace MV_DATA

    2   REFRESH WITH ROWID

    3   AS

    4   SELECT * FROM person;

2. 查看实体化视图数据:

SQL>select * from mv_per_rowid;

3. 删除 person 的一条数据:

SQL>deleta person where id=3;

SQL>commit;

4. 查看结果:

SQL>select * from person;

SQL>select *from mv_per_rowid;

5. 手动刷新 mv_per_rowid 视图,然后查询结果:

SQL>exec dbms_mview.refresh('mv_per_rowid');

SQL>select * from person;

四、子查询实体化视图
1. 插入数据库:

SQL>insert into person (id, name, deptid) values(15, 'suci', 110);

SQL>insert into  person (id, name, deptid) values(2,  'david', 120);

SQL>commit;

2. 创建实体化视图:

SQL>CREATE MATERIALIZED VIEW mv_per_dept tablespace MV_DATA

     2   AS SELECT * FROM person e

     3   WHERE EXISTS

     4   (SELECT * FROM dept d

     5    WHERE e.deptid  = d.id);

3. 查询数据结果:

4. 插入数据后手动刷新视图检查数据:

SQL>inser into dept (id, name) values(120, 'Finance');

SQL>commit;

SQL> select * from dept;

SQL>select * from mv_per_dept;

SQL>exec dbms_mview.refresh('mv_per_dept');

五、关联查询实体化视图
1.快速刷新的关联查询实体化视图

创建快速刷新的关联查询实体化视图,首先对关联查询涉及的所有基表创建实体化视图日志,为
避免产生 ORA-12052: cannot fast refresh materialized view XXX 报错,实体化
视图日志要增加 ROWID 列

SQL>CREATE MATERIALIZED VIEW LOG ON dept with rowid;

SQL>ALTER MATERIALIZED VIEW LOG ON person add rowid;

SQL>CREATE MATERIALIZED VIEW mv_per_dept _name1 tablespce MV_DATA

    2   refresh fast start with sysdate next sysdate+1/24/60

    3   AS 

    4   SELECT  e.rowid "per_rowid", d.rowid "dept_rowid",

    5   e.*, d.NAME dept_name FROM person e, dept d

    6   WHERE e.deptid = d.id;

检查结果:

SQL>slect * from mv_per_dept_name1;

插入新的数据库后等待 1 分钟后检查实体化视图数据:

SQL>insert into person(id, name, deptid) values(8, 'tiya', 108);

SQL>insert into dept(id, name) values(  108, 'Executive');

SQL>commit;

SQL>select * from mv_per_dept_name1;

2.完全刷新的关联查询视图
删除基表的实体化视图日志:

SQL>drop MATERIALIZED VIEW LOG ON person;

SQL>drop MATERIALIZED VIEW mv_per_dept_name1;

创建 commit 提交时完全刷新的实体化视图:
SQL>CREATE MATERIALIZED VIEW mv_per_dept_name2

     2   refresh COMPLETE on commint

     3   AS SELECT e.*, d.NAME dept _name

     4   FROM person e, dept d

     5  WHERE e.depetid  = d.id;

SQL>col NMAE fromat a10

SQL>col DEPT_NAME format a20

SQL>seelct * from mv_per_dept_name2;

SQL>select * from mv_per_dept_name2;

SQL>delete person where id=8;

SQL>commit;

SQL>select * from mv_per_dept_name2;

六、刷新实体化视图的方法
 自动刷新方式
1. 创建实体化视图时使用 commit 选项;
2.创建实体化视图时使用 on demand start with … next …子句;
3.使用 dbms_mview 创建 job 定时刷新。
手动刷新方法
1.SQL> exec dbms_mview.refresh('mv_per_dept_name2', 'F');
-- 刷新指定的实体化视图,刷新类型有: C—完全刷新,F—快速刷新和强制刷新。
2.SQL> execute dbms_mview.refresh_defresh_dependent(‘EMPLOYEE’);
-- 刷新利用了该表的所有实体化视图。
3.SQL> execute dbms_mview.refresh_all_mviews;
-- 刷新该模式中自上次刷新以来,未得到刷新的所有实体化视图。
 


 


 


 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体化视图 的相关文章

  • 授予用户在查询时使用表索引的什么?

    我想知道当用户从表中查询数据并且该用户已被授予以下权限时 oracle 是否使用索引 grant select on table to user 我想知道是否需要其他拨款才能使用索引 不 没有要求 或能力 授予对索引的访问权限 如果用户可以
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • 如何授予所有表的 REFERENCES 权限

    我必须授予REFERENCES登录权限说sql login 我可以给予资助REFERENCES对单个表的权限 例如 GRANT REFERENCES ON Mytable TO sql login 有什么办法可以授予REFERENCES允许
  • postgres 有 CLOSEST 运算符吗?

    我正在寻找这样的东西 给定一个表格 id number 1 7 2 1 25 3 1 01 4 3 0 查询SELECT FROM my table WHEREnumberCLOSEST 1 将返回第 3 行 我只关心数字 现在我有一个程序
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • 复选框上的数据绑定

    我目前正在将数据从 SQL 数据库之一提取到我的应用程序中 我可以让它适用于我的文本框和其他项目 但是 我似乎无法让它适用于复选框 这是我正在使用的代码 DataTable dt new DataTable dt using SqlConn
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • REgex从oracle中的字符串中获取数字

    我有以下格式的字符串 阿克拉姆 88 jamesstree 20140418 阿克兰 8 约翰街 20140418 阿克兰 888 johnstreet 20140418 现在我只想检索 88 8 和 888 值 我为此编写了以下查询 SU
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig

随机推荐

  • Qt自定义Delegate实现QTableWidget整行选中圆角矩形高亮效果

    问题背景 参照一个现有的Linux桌面应用 尽可能的模仿它的UI 其中有一个UI效果就是列表整行选中后是一个圆角矩形高亮效果 如下图所示 参考代码 先放代码 实现的思路就是用代理来重绘我们想要的效果 include
  • Socks5代理:跨界电商与游戏产业的爬虫利器与出海战略助推器

    一 Socks5代理 跨界电商与游戏产业的爬虫利器 跨界电商 跨界电商是不同行业或领域之间进行合作的电商模式 企业在拓展全球市场时 需要收集不同领域的市场情报和竞争数据 Socks5代理作为爬虫利器 能够高效稳定地实现数据采集 游戏产业 游
  • Java mail发送相关问题

    一 邮件附件变成bin格式 Java 发送邮件时 邮件附件变成 bin后缀的文件 如下图 出现这个问题 博主查阅了其他博主的文章 大致是附件名称过长或附件名称携带中文 博主代码中采用的是中文加UUID的一个拼接 如下 生成随机的UUID S
  • 【AI实战】llama.cpp 量化部署 llama-33B

    AI实战 llama cpp 量化部署 llama 33B llama cpp 量化介绍 环境配置 安装 llama cpp 拉取 llama cpp 仓库代码 编译llama cpp 生成量化版本模型 模型准备 将上述 pth模型权重转换
  • 大神之路-起始篇

    欢迎关注 WeiyiGeek 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 作者主
  • 静态路由和动态路由

    display ip routing table 查看全局路由表 路由表匹配规则 最长掩码匹配规则 路由器总是现在最精确 最优的路由项来进行数据转发 路由信息的来源 设备自动发现 直连路由 手动配置 静态路由 通过动态协议生成 动态路由 路
  • HTTP协议 (四) 缓存

    HTTP协议 四 缓存 之前写过一个篇 HTTP协议详解 这次继续介绍HTTP协议中的缓存机制 HTTP协议提供了非常强大的缓存机制 了解这些缓存机制 对提高网站的性能非常有帮助 本文介绍浏览器和Web服务器之间如何处理 浏览器缓存 以及控
  • 【软件开发】从单机到分布式

    从单机到分布式 1 单台服务器应用 问题 由于流量越来越大出现服务器性能问题 2 应用服务器和数据库服务器分离 对架构增加了一台服务器 应用和数据库分别部署到不同的服务器上 对于开发和测试没有任何影响 只需要应用服务器新增一个远程调用数据库
  • python读写文件函数_Python文件读写功能概述,python,函数,总结

    1 python读取csv文件 usr bin python coding UTF 8 df pd read csv filepath usecols func name para value df t df fillna value 对空
  • 文章上传漏洞绕过方式(以php语言为例)

    一 文件上传漏洞原因 由于网站要求 需要用户上传文件 图片 例如头像 保存简单文件上传下载 访问 如果我们将文件上传至web服务器上 并且可以访问到 那么就可以利用小马 对服务器进行操作 或者了解一些信息 因此在上传位置 代码会对上传文件进
  • 解决本地redis连接工具无法连接上宝塔面板的redis

    宝塔安装Redis步奏比较简单 这里我就不讲了 下面来开启一下外网访问 一 第一步需要放开对应安全组中Redis端口 具体端口放开可参考对应服务器厂商的说明文档 二 在宝塔中放行Redis端口 三 修改Redis配置文件将protected
  • 深度学习《图像卷积》

    骚话一下 今天是2020年10月1号 是祖国的71岁生日 也是传统节日中秋节 而我由于工作的安排身在海外不得回家 怀念祖国的乡土 倍加思念远方的亲人 由于疫情 在这里哪里也去不了 只能好好学习 用学习来充实这八天假期 本文完全是为了给CNN
  • 帮我写一个Python代码,利用tensorflow框架实现年龄预测

    import tensorflow as tf import numpy as np 创建模型 model tf keras Sequential model add tf keras layers Dense 128 activation
  • java动态代理中的invoke方法是如何被自动调用的

    一 动态代理与静态代理的区别 1 Proxy类的代码被固定下来 不会因为业务的逐渐庞大而庞大 2 可以实现AOP编程 这是静态代理无法实现的 3 解耦 如果用在web业务下 可以实现数据层和业务层的分离 4 动态代理的优势就是实现无侵入式的
  • centos安装nodejs

    下载地址 https nodejs org en download 本次安装选择的是Source Code 1 下载 wget https nodejs org dist v6 10 0 node v6 10 0 tar gz 当出现 错误
  • Error: Cannot find module ‘vue-loader-v16/package.json‘ 安装vue3.0的项目报错

    vue3 0已经更新在github上好久了 一直没有时间学习 今天好不容易想看一下 根据网上的教程 一步一步的安装 创建项目 启动的时候居然报错 一看这 怀疑是某个依赖没有装上 于是执行了一下 npm install 这次没有报错 但是报了
  • RK3568-GPIO控制

    RK3568 GPIO控制 1 Sysfs接口 实现逻辑 芯片的GPIO由芯片的GPIO控制器来管理 GPIO控制器封装在芯片内部 控制器的驱动芯片厂家已经写好了 RK3568有五组GPIO控制器 每组管理32个引脚 对应 dev下的gpi
  • SQLHelper通用类执行一条返回结果集的SqlCommand命令 使用方法

    SQLHelper cs 通用类 执行一条返回结果集的SqlCommand命令 通过专用的连接字符串 使用参数数组提供参数 使用示例 SqlDataReader r ExecuteReader connString CommandType
  • PCL只获取点云中一个点的法向量之computePointNormal

    PCL只获取点云中一个点的法向量computePointNormal 最近用点云图做应用的时候想只获取点云中一个点的法向量 然后就在网络上搜索 搜索了半天只能找到一些看似成功 实则语焉不详的文章 甚至是纯照搬 抄袭的文章 所以写下这篇文章供
  • 实体化视图

    Oracle 的实体化视图是包括一个查询结果的数据库对像 它是远程数据的本地副本 或者用来 生成基于数据表求和的汇总表 实体化视图存储基于远程表的数据 也可以称为快照 实体化视图可用于预先计算并保存表连接或聚集等耗时较多的操作的结果 这样