a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 220|回复: 4

[综合] OracleRMAN快速入门指南:Oracle分区表,分区索引

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
一:建立一个分区表,并插入数据:
3 s' G( y  ]& c- ]) _/ V$ R    SQL> create table part_tab (id1 number,id2 number)
7 X, {. R2 |; X5 G0 l    2 partition by RANGE (id1). F9 A7 D1 Z6 ]& O
    3 (, I6 X1 I" M: A5 Y3 J+ p
    4 partition p1 values less than (20),) V' J: Z! J3 Q1 P
    5 partition p2 values less than (40),
, y: S6 n) W% i3 q: G5 a    6 partition p3 values less than (60),
# o% s6 g$ N! K$ p* x! `    7 partition p4 values less than (maxvalue)
- S* p1 Y5 c. v0 q/ `+ U2 O    8 );& Z/ @( T4 G3 b9 {! b
    Table created.$ @5 I& Q* O$ X' a' c- u0 S
    SQL>( H) D" S1 e- f& U
    SQL> insert into part_tab select user_id,trunc(dbms_random.value(1,100)) from dba_users;
( q; K' c) s% A. f) R1 L7 W2 F6 |" G    37 rows created.; P8 ~" c9 r2 u' x- D
    SQL>
, Q- i* N$ v) `- R( L    SQL> commit;
+ A9 j6 ?- ]7 h1 b0 |9 D    Commit complete.0 a/ Q! w% |/ ]
    二:建立索引( V  X0 @) |: R! @0 K
    在分区表上建立索引可以分为全局索引和本地索引:全局索引是针对整张表建立的一个索引,可以在建立索引的时候根据索引键进行相应的分区;% T# F+ w; q0 `
    SQL> create index global_index on part_tab(id1) global
, m, [2 Y; I7 F: B. E    2 partition by range(id1)) N" F; Q; U* d/ [8 _
    3 (
$ X( \8 ]( z0 o$ a4 S; C) O* z    4 partition p1 values less than (50),
* Q7 d0 k( T1 ^9 ~7 J+ H    5 partition p2 values less than (maxvalue)/ h1 z5 S/ X( U( |0 |
    6 );$ l+ m4 p# V4 M
    Index created.4 @# b1 F0 l3 O
    SQL> create index global_index2 on part_tab(id2) global8 \& w* e+ X! s1 C9 S& O) N; ~
    2 partition by range(id2): H$ t  j+ _+ U* C
    3 (; N5 V6 m  ]; S& B
    4 partition p1 values less than (50),
' l  o$ L' H( s    5 partition p2 values less than (maxvalue). W. |: `6 M' W* M! C, Q
    6 );4 d* H. u  h8 [4 ?+ y/ z
    Index created.
# Q- i6 e7 d& _1 C4 z7 S# Y5 \    以上就是对id1和id2字段建立了2个全局索引
% p: U8 J, U4 b% K8 g4 W    建立全局索引的时候索引键必须是索引分区键的前缀,不然建立索引的时候会报错:
. y# X. g+ y+ r6 S% D& e    SQL> create index global_index2 on part_tab(id2) global
3 Q. o) L0 S$ ]# K* U4 h
' B# z8 f$ p9 g9 e9 h    2 partition by range(id1)
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:50 | 显示全部楼层

OracleRMAN快速入门指南:Oracle分区表,分区索引

</p>    3 (
0 R0 p. M3 S( @$ @- Q+ s  R& Z8 o) K4 R, R    4 partition p1 values less than (50),
7 P" R" s8 ?/ e" C    5 partition p2 values less than (maxvalue)/ M/ x5 ]% }# s0 t0 S8 `+ E
    6 )
+ ]  G8 }" l/ ]* I: ?7 j0 P    7 ;/ @! z. g+ s$ y. X2 ]. x) C
    partition by range(id1)2 a# p1 \- N: ], `
    *
# c7 T/ n0 _5 L/ W    ERROR at line 2:: e6 ]) C1 R3 T! o* g
    ORA-14038: GLOBAL partitioned index must be prefixed* ~3 Q! k; G! t8 J' v
    SQL> create index global_index5 on part_tab(id2,id1) global
9 e% R; T* O$ D9 e, _$ [7 @    2 partition by range(id2)7 g3 G; o9 B* X, ^
    3 (, T) S7 ~( t/ C$ r: \, s$ W
    4 partition p1 values less than (50),
5 j/ \, P6 V  X    5 partition p2 values less than (maxvalue)
' |* O$ n( h1 r    6 );: z- f  [3 t  N
    Index created.
; \: F% k, Y7 c+ e; m0 a    如果建立本地索引的时候,要建立的字段已经建立的全局索引,那建立这个索引的时候也要报错,反之亦然:1 Q7 F8 Y6 Y3 b( M
    SQL> create index local_index1 on part_tab(id1) local;
, q  }4 m7 g. l1 P* \    create index local_index1 on part_tab(id1) local& b: _4 k, f0 r" Y5 b6 {% F* c- |8 ^" [
    *
7 ?1 w6 t/ K7 M8 v9 o( X9 c    ERROR at line 1:# t2 O4 v* K+ v  E# C
    ORA-01408: such column list already indexed
# ^! Q$ H& _' z) g4 d9 ?3 `    SQL> create index local_index1 on part_tab(id2) local;
& C( U4 C5 N+ z4 L" B    create index local_index1 on part_tab(id2) local
- x8 w2 s+ q" ]" Q& S0 Z  a5 o    *2 A, z2 F& U" J
    ERROR at line 1:! n  q5 `1 p4 _) a- u
    ORA-01408: such column list already indexed
% f5 E: U1 W3 |    删除其中之一就可以正确建立:
2 y+ J0 V  Q/ D( g    SQL> drop index global_index2;# _, Z5 f3 o# a5 S3 D$ _
    Index dropped.6 ~  n9 @% |+ P7 ~8 U" e
    SQL> create index local_index1 on part_tab(id2) local;
+ G( Y$ A( Y) _    Index created.* z* j. ~+ N. r2 e! A4 k2 _
    三:增加分区
# y. R3 n1 O8 r0 ]: E1 s    增加分区的时候,本地索引会自动更新,会自动增加相应的分区索引;而全局索引则不会,如果增加分区的时候没加上update global indexes 字句的时候,全局索引就会失效:
. p5 `/ H; m4 q8 o1 R7 B    在原先分区表的基础上增加一个分区: L' o% u8 J& L/ M! v5 o  z
    SQL> alter table part_tab add partition p5 values less than (80);: J5 S' B* Q) p9 c
    alter table part_tab add partition p5 values less than (80)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:51 | 显示全部楼层

OracleRMAN快速入门指南:Oracle分区表,分区索引

ERROR at line 1:
. M5 n( J. \9 u- b3 X  X* G' n    ORA-14074: partition bound must collate higher than that of the last partition
  I. f, }% ]/ h) C    报错,意思就是说现在要建立的分区值必须大于最后一个的分区值
8 S5 y1 v  m% O  J$ j    这里可以有2种方法:1 L8 Q8 Q6 s  i/ u9 c
    1:把大的那个分区删掉,再增加相应的分区,但这样会丢失数据: d$ F' @# J7 b- }: H+ ^3 j* m
    SQL> select * from part_tab where id1 > 60;: U5 ]4 ?$ C$ c
    ID1 ID2* @9 }) ^& O0 L1 R
    ---------- ----------
" c; |+ v% K) Z8 X* T, C6 l- x    86 7& b9 m; R/ V3 C0 ?6 K- l
    88 18
1 V. f! U8 l) Y& }: P- y- f    70 25
5 E' l5 e5 y4 N# b0 a    65 34! R) f$ h: d6 x' x- s6 z" i8 @
    78 51, n- c% B) I1 r- U8 J
    76 57% u/ w3 {6 k* e. {. t
    67 593 J' Q* S+ @2 X5 o" G
    85 60# O$ _, w4 W! r) f8 \+ W! @  m* W
    91 62
' p4 \) @9 Z' e) d  ^) b6 S    89 636 B; [: p7 U+ o* c! M' u/ J  U# L
    74 668 Y* R( S7 P( O
    ID1 ID2  [$ k- o2 N. y5 Q4 h
    ---------- ----------
( Z: J( b) `+ X0 i( B    75 66
. \5 h( d: h/ {+ _    87 68
# y8 G% U' ?) t0 G0 r+ y  p, j- c
3 v* ]3 m2 J# d" R" v    84 73
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:52 | 显示全部楼层

OracleRMAN快速入门指南:Oracle分区表,分区索引

</p>    2147483638 811 P: o& M+ n; Q' \: k* L. d
    83 82+ C- g# v) M5 y- }
    72 893 t3 ~# K# c, c8 ^" X
    79 89
3 c! o7 Y$ g  b) O    61 92
& z) G9 Q! l1 S$ C; U/ w    90 95- Z. o( G; s6 W  [
    20 rows selected.% r, I' j" z% u/ G" b) E  |4 C
    SQL> alter table part_tab drop partition p4 update global indexes;
, |  ?4 w% U9 t6 D0 g7 U7 v    Table altered.7 }7 p) z& u4 i( m
    SQL> select * from part_tab where id1 > 60;; f! j, j- M) H& b4 M
    no rows selected
4 o7 F( N. m, Y6 k    SQL> alter table part_tab add partition p4 values less than (maxvalue);/ x5 L; A+ ?" {7 J
    Table altered.' Q# X9 o2 \+ ]
    2:SPLIT PARTITION,分割那个分区,但对应分区上的本地索引会失效,分割完以后要重建这个本地索引+ a7 t4 t* A, i$ T1 N0 s
    点击(此处)折叠或打开( E/ L0 a0 o& F( e  v; w4 k2 o2 j0 j
    SQL> select count(*) from part_tab where id1 > 60;
/ b( W3 ?" T. _+ y2 l, x( T2 \    COUNT(*)' t9 z5 e' H$ }) D2 ?
    ----------4 k- k- {+ }- _7 l) q
    209 {/ |$ ~- {, i8 V
    SQL> ALTER TABLE part_tab SPLIT PARTITION p4 AT (80) INTO (PARTITION P5, PARTITION P4) UPDATE GLOBAL INDEXES ;
; G0 d) l3 H3 i& A  p9 ]3 N8 J3 c    Table altered.! d* [+ Y. @/ l* u
    SQL> select count(*) from part_tab where id1 > 60;7 W. I9 r6 e( u1 \( V, \5 F7 H* u
    COUNT(*)" j. K9 Z* `/ }$ ^& t! u
    ----------
  ?2 x+ u$ b6 f/ p( v3 B    20. q7 _! R: l% A: q
    SQL> select * from part_tab where id1 > 80;* V) Z) X6 {' Y: C( d
    ID1 ID2( Y# g, q" @" p* Y9 Y. F
    ---------- ----------) b$ s' V7 D3 N* ~1 @' ^5 Y
    90 4$ t8 T! b$ }2 E! y9 [
    2147483638 5# {& A1 J' b* E; B5 [0 K
    89 21, w# j4 Q, G2 x( }1 D
    84 24
0 ~) _7 u; |! O5 }    86 28
6 `( B& K1 |; e6 }6 l' b/ X! `; d; f5 C$ b5 ^/ \" n; H
    83 36
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:53 | 显示全部楼层

OracleRMAN快速入门指南:Oracle分区表,分区索引

</p>    87 520 l3 n$ |" T! ]9 H( r
    85 62; l0 _4 i) J; c& I  o3 m8 h% [
    88 70$ J2 X( Z* Y$ C  g- E0 z& G% h# ^; M
    91 95
' @7 h/ I1 A' U+ ?% W    10 rows selected.* H4 e: ^' h( n( ?, s
    SQL> select index_name,partition_name,status from user_ind_partitions;
  `- A0 I; _) c" h, ]    INDEX_NAME PARTITION_NAME STATUS2 u5 _: c4 B$ g, Y; T3 Y
    ------------------------------ ------------------------------ --------
/ W4 d  M- i- T& h    GLOBAL_INDEX P1 USABLE
8 E. _5 L1 \8 V! W6 R4 m    GLOBAL_INDEX P2 USABLE0 P1 [0 k( c5 a0 e! {
    LOCAL_INDEX1 P2 USABLE" F$ K" M6 L( z# |1 {4 }; V
    LOCAL_INDEX1 P1 USABLE
- t  B/ T- k5 ~1 t    INDEX_NAME PARTITION_NAME STATUS
2 b- a" ?7 N# d    ------------------------------ ------------------------------ --------* ~: ~  J) i: |4 I4 d4 R
    LOCAL_INDEX1 P3 USABLE
* x$ H6 j' N9 S! z/ O( [    GLOBAL_INDEX5 P1 USABLE# R# u1 _$ n! P& \1 f" u: \4 v4 i- T
    GLOBAL_INDEX5 P2 USABLE
2 _3 _+ ?: s( o0 O) i    LOCAL_INDEX1 P5 UNUSABLE
& l& k, x8 o3 _7 A    LOCAL_INDEX1 P4 UNUSABLE( D9 S1 ]( l& A' B' i
    SQL> alter index local_index1 rebuild partition p4;( e  e$ T0 \+ L8 A
    Index altered.
# B- `8 m( f4 a; j7 _" k  v6 I    SQL> alter index local_index1 rebuild partition p5;# V9 B& [5 a; {5 e9 O! {$ H) w
    Index altered.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 14:52 , Processed in 0.262595 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表