sql - Oracle - 子查询的物化视图
问题描述
从文档中我了解到,我们无法在其中包含子查询的查询上创建物化视图。所以我创建了一个普通的 oracle 视图并使用该普通视图创建了一个物化视图
CREATE MATERIALIZED VIEW TEST_MV BUILD IMMEDIATE
REFRESH FORCE AS
SELECT * FROM "MAIN_LOOKUP"
这个“MAIN_LOOKUP”视图中有很多子查询
帮助我理解以下几点
- “主要查找”视图具有将实时使用的表和数据更改的高机会。由于该选项被指定为 FORCE,它会自动刷新吗?
- 我不能包括选项 ENABLE QUERY REWRITE 它说“不支持查询重写的表达式”。如果没有指定该选项,创建的 MV 会有什么问题吗?
- 我们是否应该为所有基础表创建物化视图日志?
谢谢
解决方案
根据文档:
指定 FORCE 表示当发生刷新时,如果可能,Oracle 数据库将执行快速刷新,如果无法快速刷新,则执行完全刷新。
这指定了将发生哪种类型的刷新:如果可能,快速(增量)刷新,否则完全刷新。它不会自动刷新任何内容。
该ON COMMIT
选项将自动更新 MV,但如果源表高度活跃,则会显着影响应用程序性能:
指定 ON COMMIT 以指示每当数据库提交对物化视图的主表进行操作的事务时都会发生刷新。此子句可能会增加完成提交所需的时间,因为数据库执行刷新操作是提交过程的一部分。
换句话说,这将序列化所有源表上的所有事务,强制每个表上的每次提交都刷新 MV。
默认情况下不启用查询重写,因此不包括它不会影响任何事情。如果要启用它,则它必须满足以下条件:
启用查询重写受以下限制:
仅当具体化视图中的所有用户定义函数都是 DETERMINISTIC 时,您才能启用查询重写。
仅当语句中的表达式可重复时,才可以启用查询重写。例如,您不能包含 CURRENT_TIME 或 USER、序列值(例如 CURRVAL 或 NEXTVAL 伪列)或 SAMPLE 子句(随着物化视图内容的变化,它可能对不同的行进行采样)。
如果您的 MV 符合 FAST REFRESH 的标准,请在源表上创建 MV 日志。您仍然必须手动刷新 MV,或者使用计划的作业。
FAST 刷新受以下限制:
当您在创建时指定 FAST 刷新时,Oracle 数据库会验证您正在创建的物化视图是否符合快速刷新的条件。当您在 ALTER MATERIALIZED VIEW 语句中将刷新方法更改为 FAST 时,Oracle 数据库不会执行此验证。如果物化视图不适合快速刷新,则当您尝试刷新此视图时,Oracle 数据库会返回错误。
如果定义查询包含分析函数或 XMLTable 函数,则物化视图不适合快速刷新。
如果定义查询引用定义了 XMLIndex 索引的表,则物化视图不符合快速刷新的条件。
如果实体化视图的任何列被加密,您将无法快速刷新它。
文档中有一些关于使用快速刷新物化视图的额外限制,其中许多是有条件的。做好功课并阅读要求和例外情况,以确定它们是否适用于您的具体情况。对于实际示例,您还可以查看各种在线教程和示例,例如这个。
推荐阅读
- java - Java Web 本地启动
- java - 堆栈值未读入文件
- node.js - 我无法在 expo 项目上安装任何新的 npm 包
- c++ - C++ 自定义惰性迭代器
- javascript - 如何使用 node.js 在浏览器上加载带有 html 的 javascript 文件
- node.js - 尝试在 Node 中更新 Postgres 数据时出现 ERR_HTTP_HEADERS_SENT 错误
- python - Is there a fast way to add two three dimensional arrays?
- java - Java 将对象添加到错误的向量中(它甚至没有写成它应该写的代码)
- django - 使用 UpdateView 不保存数据的自定义表单字段呈现
- coq - What is the difference between Lemma and Theorem in Coq