视图索引(Oracle)

Cli*_*ton 19 sql oracle

可以说我有两张桌子,tab_a而且tab_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
);
Run Code Online (Sandbox Code Playgroud)

如果我做以下事情:

select * from join_tabs where col_z = 'BLAH';
Run Code Online (Sandbox Code Playgroud)

如果tab_a索引col_xtab_b索引col_y,我们应该能够通过两个索引搜索来执行此操作.

但是,如果我可以在一个索引中对两个表创建索引,甚至索引视图,那么如果源表(tab_atab_b)发生更改则会立即自动更新,这样会很好.

有没有办法在Oracle中执行此操作?

Lie*_*ers 21

我不是与甲骨文相提并论,但我相信Materialized Views就是这么做的.

选择物化视图的索引

物化视图上最常见的两个操作是查询执行和快速刷新,每个操作都有不同的性能要求.查询执行可能需要访问实体化视图键列的任何子集,并且可能需要加入并聚合这些列的子集.因此,如果在每个物化视图键列上定义了单列位图索引,则查询执行通常会执行得最好.

对于仅包含使用快速刷新的连接的实例化视图的情况,Oracle建议在包含rowid的列上创建索引,以提高刷新操作的性能.

如果使用聚合的物化视图可快速刷新,则会自动创建索引,除非在CREATE MATERIALIZED VIEW语句中指定了USING NO INDEX.

  • 增量更新意味着仅应用对基础表所做的更改来刷新MV,而不是重新执行整个查询以刷新MV.这要求MV日志存在于基表上,并且MV足够简单以允许增量更新.对于MV的查询完全有可能返回与对基表的查询不同的结果.通常,例如,MV用于将数据从一个系统复制到另一个系统,其中在源处进行的更改与出现在目的地之间存在滞后. (7认同)
  • @Clinton - "快速刷新"表示数据以递增方式更新.物化视图定义中的"提交时刷新"意味着在提交源表更改时更新数据 - 刷新与提交同步.提交时刷新需要快速刷新,但快速刷新并不意味着提交时刷新. (5认同)

Has*_*him 10

您无法在视图上创建索引,因为视图仅仅是某些表上的掩码.为此,请创建@Lieven指定的物化视图并在其上创建索引.