sql - Oracle/RDBMS 增量查询引擎
问题描述
我不确定“增量”是否是正确的词。我将继续说明问题。
我有两个大表,X 和 Y。Z 是另一个表,它是 X 和 Y 的连接。
Create Table Z as
select X.col1, X.col2, Y.col2, Y.col3
from X
join Y on X.id=Y.id"
现在,每当表 X 或 Y 中的任何值被更新时,我在 Z 中的数据都应该被刷新。有两种方法可以做到:
定期显式刷新表 Z。缺点是 1) 数据不会实时更新 2) 再次运行连接的刷新虽然只更改了一个字段,但会花费大量时间。
根据 X 和 Y 中的任何更改在表 Z 中进行增量更新。可能的好处是它是实时的并且不会花费太多时间来更新,因为只会更新相关的行。
我正在寻找有关如何为 Oracle 或任何其他数据库实施 2) 方法的任何帮助/指导?
解决方案
要将 Justin 和 Alex 的评论(和暗示的答案)转化为答案,您可能需要使用物化视图。如果您不熟悉它们,常规视图中的数据实际上并不存在,而只是从视图定义中的表中的数据返回,物化视图会创建数据的物理表示,并且该物化视图可以以多种方式刷新。我将表X
和表Y
(“基表”)之间的连接称为下表Z
,但Z
可能是表、视图或物化视图:
正如 Alex 所暗示的,您可能有不想使用物化视图的原因,所以让我提一些不使用的常见原因:
- 生成的物化视图会占用大量的物理磁盘空间;例如在加入大表时
X
会Y
创建一个大表Z
- 基表 X 和 Y 经常更新,并且表
Z
的访问频率不如基表更新的频率高
同样,以上是轻率的概括;您将需要测试各种选项。
物化视图而不是真实表Z
或视图的优点Z
包括:
- 与从基表中获取数据的视图相比,对数据的快速访问
- 物化视图可以按基于时间的计划刷新,或者在基表上的数据更改时刷新,或者根据请求刷新。由于您包含了etl标记,因此您可以在特定过程或作业运行后刷新物化视图。
- 您可以在基表上创建物化视图日志,以进一步加快物化视图的刷新速度。
- 如果对表的查询
Z
很频繁,则物化视图可能会比常规视图更快。
所以测试几种方法:你的前两种方法,一个常规视图和一个物化视图。如果表Z
不需要基表中的大量列,则可以使用常规视图。如果连接条件产生少量行,则物化视图可能是最好的。
参考:
推荐阅读
- r - 当我没有分隔符时,如何将 R 中的列拆分为两列?
- javascript - 如何在 Firestore Web 上创建子文件夹和文档?
- r - 如何在R中向量化贪心算法?
- matlab - Givens 旋转 QR 分解
- sql - 如何列出依赖于 Redshift 中特定表的表/视图?
- git - 无法通过 wget 下载
- c# - SqlDependency 尝试使用 log4net 做某事并且无法启动
- javascript - 保存对文档片段的引用的函数属性:何时使用 cloneNode?
- linux - UIO 和 msync:为什么即使地址是 PAGESIZE 的倍数,msync 也会返回“无效参数”
- html - 单击导航项时,如何将 ProgressBar 元素设置为可见?