0

Oracle 中的物化视图是什么?它有什么用?我在网上搜索了这个主题,但我无法清楚地了解它。所以你能用一个清晰​​的例子来解释这个话题吗?这样对我来说清楚地理解这个话题会更有用。

4

3 回答 3

7

物化视图是 RDMS 提供的一种机制,用于交换额外的存储消耗以获得更好的查询性能。

例如,假设您有一个非常大的查询,包含 10 个表连接,需要很长时间才能返回数据。如果将查询转换为物化视图,则此查询的结果将自动物化到磁盘上的特殊数据库表中,更好的是,当添加/更新/删除行时,它们会自动反映在物化视图中。

不过,这个方便的工具的权衡是对基础表的插入和更新速度较慢。物化视图是 Oracle 恕我直言的少数可取之处之一。

这是一个两表连接的示例MATERIALIZED VIEW

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.*, P.*, V.ROWID as V_ROWID, P.ROWID as P_ROWID, (2+1) as Calc1, 'Constant1' as Const1
    FROM TPM_PROJECTVERSION V
         INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID

现在,您不必每次都运行相同的查询,只需针对运行速度更快的新视图运行这个更简单的查询。真正酷的是您也可以添加派生列和计算列。

SELECT * FROM MV_Test WHERE ...

附言

MATERIALIZED VIEWS不是灵丹妙药,在查询速度非常慢且经常使用大量连接并且读取远远超过写入的情况下使用它们。

于 2013-09-27T06:27:55.627 回答
1

一个(几乎)真实世界的例子。

假设您被要求开发一个企业范围的实时库存报告,该报告将输出企业所有仓库的总库存价值。

然后,您需要创建一个查询以

  1. 汇总存储在按项目和仓库分组的库存交易表中的所有交易
  2. 将总和与存储每计量单位当前价格的表连接起来
  3. 每个仓库再次总结

在企业中,这样的查询需要几个小时才能完成(即使是中型公司也可能有数十万个不同的项目),并且它的性能会随着时间的推移而恶化(想象这个查询运行超过 5 年的数据)。

因此,您将编写与物化视图相同(或多或少)的查询。创建后,oracle 将使用您的查询结果填充一个表(将其视为隐藏表),然后,每次将事务提交到库存时,将更新与此特定项目有关的记录。如果物品的价格发生变化,它将更新其价值。通常,基础表上的每个更改都会立即反映在您的物化视图上。然后,您的报告将在非常合理的时间运行。

最重要的是,通过使用 GROUPING BY 和 GROUPING,您可以在同一个物化视图上获得不同级别的钻取。

但请记住,这是一个理想化的例子。在实践中,当您在频繁更新的表(通常是库存事务)上创建物化视图时,ON COMMIT(即与基础表同时更新物化视图)可能会导致问题,并且您可以根据情况编写,中间 MV 以提高性能。每 5 分钟刷新一次这样的视图是一个可行的选择。

MV 是一个非常强大的功能,但您需要小心使用它们。

于 2013-09-27T08:47:41.723 回答
0

什么是物化视图?

物化视图是来自单个时间点的目标母版的副本。主文件可以是主站点的主表,也可以是物化视图站点的主物化视图。而在多主复制表中,其他主站点会不断更新,而物化视图是通过单个主站点或主物化视图站点的单个批量更新(称为刷新)从一个或多个主站点更新的,如图 3-1 所示. 图 3-1 中的箭头表示数据库链接。

-- http://docs.oracle.com/cd/A97630_01/server.920/a96567/repmview.htm

示例——为员工表创建物化视图。可以将刷新设置为首选项,因此请阅读上面链接中的文档。

CREATE MATERIALIZED VIEW employee_mv
REFRESH FORCE
BUILD IMMEDIATE 
ON DEMAND
AS
SELECT * FROM employees

物化视图也只能包含数据的子集

CREATE MATERIALIZED VIEW employee_mv
REFRESH FORCE
BUILD IMMEDIATE 
ON DEMAND
AS
SELECT name, ssn, address FROM employees
于 2013-09-27T06:25:03.570 回答