【问题标题】:Index on view (Oracle)视图索引 (Oracle)
【发布时间】:2011-06-30 07:48:26
【问题描述】:

假设我有两张桌子,tab_atab_b

我创建了一个如下视图:

create view join_tabs as
(
  select col_x as col_z from tab_a
  union
  select col_y as col_z from tab_b
);

如果我执行以下操作:

select * from join_tabs where col_z = 'BLAH';

如果tab_a 索引col_xtab_b 索引col_y,我们应该能够通过两个索引搜索来做到这一点。

但是,如果我可以在一个索引中为两个表创建索引,甚至为视图建立索引,如果源表(tab_atab_b)发生更改,它会立即自动更新。

有没有办法在 Oracle 中做到这一点?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我没有达到 Oracle 的水平,但我相信 Materialized Views 确实做到了。

    为物化视图选择索引

    两个最常见的操作 物化视图是查询执行 并且快速刷新,每次操作 有不同的表现 要求。查询执行可能 需要访问的任何子集 物化视图键列,以及 可能需要加入和聚合 这些列的子集。 因此,查询执行通常 如果单列表现最好 位图索引被定义在每个 物化视图键列。

    在物化视图的情况下 仅包含使用快速的连接 刷新,Oracle 建议 在列上创建索引 包含 rowids 以改进 刷新操作的性能。

    如果物化视图使用 聚合是快速刷新的,那么 自动创建索引 除非 USING NO INDEX 在 创建物化视图 声明。

    【讨论】:

    • 能否使这个物化视图在源视图发生变化时立即更新?这就是“快速刷新”的作用吗?
    • @Clinton - “快速刷新”意味着数据以增量方式更新。物化视图定义中的“提交时刷新”意味着在提交源表更改时更新数据——刷新与提交同步。提交时刷新需要快速刷新,但快速刷新并不意味着提交时刷新。
    • @Justin,感谢您的澄清。 OP 需要“提交时刷新”,但现在你让我想知道什么是增量更新。我假设,像 SQL Server 一样,从物化视图中选择会总是返回与创建视图的选择相同的结果。我的假设错了吗?
    • 增量更新意味着只应用对底层表所做的更改来刷新MV,而不是重新执行整个查询来刷新MV。这要求 MV 日志存在于基表上,并且 MV 足够简单以允许增量更新。与针对基表的查询相比,针对 MV 的查询完全有可能返回不同的结果。例如,经常使用 MV 将数据从一个系统复制到另一个系统,在该系统中,在源进行的更改与出现在目标的更改之间存在延迟。
    • @Justin - 你应该对此做出回答,这样我就可以删除我的了。你有我的投票。
    【解决方案2】:

    您不能在视图上创建索引,因为视图只是某些表上的掩码。为此,请创建@Lieven 指定的物化视图并在其上创建索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2012-06-26
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2012-01-31
      相关资源
      最近更新 更多