假设我有两个表,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
);
如果我执行以下操作:
select * from join_tabs where col_z = 'BLAH';
如果tab_a
索引col_x
和tab_b
索引col_y
,我们应该可以通过两次索引搜索来完成此操作。
但是,如果我可以在一个索引中为两个表创建索引,甚至索引视图,那将是一种很好的方式,如果源表(tab_a
或{{1} })改变。
有没有办法在Oracle中执行此操作?
答案 0 :(得分:21)
我与Oracle并不相同,但我相信Materialized Views正是这样做的。
a上最常见的两个操作 物化视图是查询执行 并快速刷新,以及每个操作 有不同的表现 要求。查询执行可能 需要访问的任何子集 物化视图键列,和 可能需要加入并聚合 这些列的子集。 因此,通常会执行查询 如果是单列,则表现最佳 每个都定义了位图索引 物化视图键列。
在物化视图的情况下 仅使用快速包含联接 刷新,Oracle建议 索引将在列上创建 包含rowid来改进 刷新操作的性能。
如果物化视图使用 然后,聚合是快速刷新的 将自动创建索引 除非在中指定了USING NO INDEX CREATE MATERIALIZED VIEW 言。
答案 1 :(得分:10)
您无法在视图上创建索引,因为视图仅仅是某些表上的掩码。为此,请创建@Lieven指定的物化视图,并在其上创建索引。