回答

收藏

视图索引(Oracle)

技术问答 技术问答 214 人阅读 | 0 人回复 | 2023-09-14

可以说我有两个表,tab_a和tab_b。
# x* V9 t' t6 a) P我创建如下视图:
0 g6 q* r5 a! \  _' z& x4 |6 \create view join_tabs as
7 O; e1 F4 a; d& B5 g  y$ p(  N8 m  |0 b9 v* R+ z' ?- W% P
  select col_x as col_z from tab_a: V7 [& m9 {6 R2 }
  union8 g7 }( U! z  }6 O! x6 u" j. Z
  select col_y as col_z from tab_b
% n5 s" S+ s- \9 S);
$ u) E+ u8 I" E' w6 ^如果执行以下操作:0 J, ?& E, t$ M1 P
select * from join_tabs where col_z = 'BLAH';
' Q# I0 ^! y! W! w/ [4 w# P- T如果是tab_aindexcol_x和tab_bindex col_y,那么我们应该可以通过两个索引搜索来做到这一点。4 d5 I" N0 H+ o
但是,如果我可以在一个索引中对两个表建立索引,甚至对视图建立索引,那都会很好,如果源表(tab_a或tab_b)发生更改,该方法可以立即自动更新。1 Z" V+ W: B% \- z1 G2 Y' f
在Oracle中有没有办法做到这一点?
7 P6 ]; c$ R1 p5 k% P# @# T               
6 E. C/ \3 X3 U- |# Z% S* `解决方案:
. y9 I7 @( B" ~3 J                9 O2 j% c! A4 a; s  _: x

* Z* K% y( a6 W5 N3 b& o: e6 `
# V4 g: Q/ I; G                我不能与Oracle相提并论,但是我相信物化视图可以做到这一点。
; Y4 ?2 t" C# ^. F为物化视图选择索引1 l" A, u" W& }+ H, f
物化视图上最常见的两个操作是查询执行和快速刷新,并且每个操作都有不同的性能要求。查询执行可能需要访问实例化视图键列的任何子集,并且可能需要在这些列的子集上进行联接和聚合。因此,如果在每个实例化视图键列上定义了单列位图索引,则查询执行通常会表现最佳。
; A# A* I- T  n: }  \如果实例化视图仅包含使用快速刷新的联接,则Oracle建议在包含行ID的列上创建索引,以提高刷新操作的性能。
7 `% g+ M, {  A/ W( m( a如果使用聚合的物化视图可快速刷新,则除非在CREATE MATERIALIZED VIEW语句中指定了USING NO INDEX,否则将自动创建索引。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则