能否描述一下索引的原理,最好能介绍索引表的结构

上一篇 / 下一篇  2009-01-07 22:46:46 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
  关于Oracle索引       51Testing软件测试网HX zT7mwu
  如何为你的表的主键、唯一性约束所创建的索引定义自己的表空间和别的参数?       51Testing软件测试网!FH Lj|{*fx
   51Testing软件测试网A^0l#p/sQc.La _2\2I
    Oracle里边,如果你在一张表上面加上了唯一性约束或者主键约束,Oracle会自动为那个表创建索引来保证这些约束的。  51Testing软件测试网N8ge|Rr#})}(c2s
    比如下面的语句:  51Testing软件测试网5U1v;ey n:ou9}D}
    SQL>   CREATE   TABLE   TEST    51Testing软件测试网,Sjsse*YG s$[
     2   (NAME   VARCHAR2   (20)   PRIMARY   KEY,  51Testing软件测试网m0XA'xc*ZP0~E
     3   AGE   NUMBER);  
'X%Vv Ag'x&k0   51Testing软件测试网5Zyj4PK1E{.\
    表已创建。  51Testing软件测试网7W/WQ.\&t0T5f1_3op/eh
    可以用下面的语句看到,Oracle自动创建了一个叫做SYS_C004006   的索引:  51Testing软件测试网J ^*S*BZ9x[S1J:O
    SQL>   SELECT   INDEX_NAME,   TABLE_NAME,   tablespace_name   from   USER_INDEXES   WHERE   TABLE_NAME='TEST';  51Testing软件测试网 Y$k2VT[q sc7G
   51Testing软件测试网+cu6~"P _ V5i!kI
    INDEX_NAME        TABLE_NAME         TABLESPACE_NAME  51Testing软件测试网1G&JP0@\ J
    -----------------    -------------------- ----------------------  
Tu*C"G*ZPfK0    SYS_C004006          TEST            TOOLS  
Bzt*D}0   51Testing软件测试网'k#|)en:l.ybF
    这个时候,再看看DBA_SEGMENT,可以看到,这一切都是用了这个表空间的默认存储参数:  
.OR#_8o+Ha1x1C0    SQL>SELECT   OWNER,   SEGMENT_NAME,   SEGMENT_TYPE,  
8[DY4ovur_0      EXTENTS,   INITIAL_EXTENT,   NEXT_EXTENT,   MAX_EXTENTS,   PCT_INCREASE  51Testing软件测试网&mj2S.p9Yj,r
      FROM   DBA_SEGMENTS   WHERE   SEGMENT_NAME='SYS_C004006';  51Testing软件测试网 p~PK1h(_
   51Testing软件测试网*NA:iPP4k'kF
    OWNER       SEGMENT_NAME       SEGMENT_TY      EXTENTS   INITIAL_EXTENT   NEXT_EXTENT         MAX_EXTENTS   PCT_INCREASE  51Testing软件测试网c(_{!M&en:\6B7?
    --------   -------------   ----------   ----------   --------------   -----------   -----------   ------------  51Testing软件测试网X8}x$`w m
    CHAOS     SYS_C004006      INDEX       1        10240     10240     121            50  51Testing软件测试网|x/G8o)M"n1[
   51Testing软件测试网5g KI"u1|c ]
    对于大多数索引来说,这些存储参数并不合适,不利于系统的性能和维护。  51Testing软件测试网"uZa:I0z k#M
    能不能对于这些索引像普通索引那样定义自己的表空间、存储参数呢?  
;Md h1hMII+` K,B%Z0    答案是肯定的,我们可以做到,这就要用到Oracle的创建表或者改变表语句中的一个USING   INDEX子句。  51Testing软件测试网7F OkP{
    下面让我们来仔细分析这个子句的用法:  
O`9fHn%@H:W?0      51Testing软件测试网H/p/B.@w*?
    从这个图里我们可以看到,我们可以为这个索引指定很多具体的参数,而不必都服从Oracle的分配:我们可以指定INITRANS,MAXTRANS,TABLESPACE,LOGGING/NOLOGGING,以及具体的存储参数比如:         INITIAL,NEXT,MINEXTENTS,MAXEXTNETS,PCTINCREASE等等。  51Testing软件测试网+Fo"o4C4b"C&[~
    例子:  51Testing软件测试网n G].Q-NX#G
    SQL>   CREATE   TABLE   TEST  
:yw'q S.~4O1pn0     2   (NAME   VARCHAR2(30)   PRIMARY   KEY    
FI;d$A'wm0     3   USING   INDEX  51Testing软件测试网!n/q5XS&?)Fp
     4   TABLESPACE   INDEXS    
a*v2?z*gb;d0     5   PCTFREE   0  51Testing软件测试网1G d fc~)i+nyI6d?
     6   STORAGE  51Testing软件测试网SO'XI9^%X\v
     7   (INITIAL   1M  51Testing软件测试网`^ J9J2x\U
     8   NEXT   1M  51Testing软件测试网G%x v:AZ'UU+|
     9   MINEXTENTS   2  
}RI:I._Jw`0     10   MAXEXTENTS   100  
b8wX p{2]+@b*I0     11   )  
{3nmL8?(B w'Y%w0     12   ,  51Testing软件测试网#X K/B7rF&J8d-W8T
     13   AGE   NUMBER);  51Testing软件测试网(mJ"~@;k+T6R
   51Testing软件测试网i{C5mm,xmg.U
    表已创建。  
7rO+Eju6]8e`)?0    SQL>   SELECT   INDEX_NAME   FROM   USER_INDEXES   WHERE   TABLE_NAME='TEST';  
I#QR.F4H)?f(B0   51Testing软件测试网5NL3q)M&L&C
    INDEX_NAME  
X3vD0D_v^!I/h0    ------------------------------  
O{g5@V pR%A~0    SYS_C004007  51Testing软件测试网+`0`'N\h*gND
   51Testing软件测试网/_A{;z*X k0mHLF
    SQL>                                     SELECT             OWNER,SEGMENT_NAME   ,SEGMENT_TYPE,EXTENTS,INITIAL_EXTENT,NEXT_EXTENT,MAX_EXTENTS,PCT_INCREASE  51Testing软件测试网cd4Is+e*H
    2   FROM   DBA_SEGMENTS   WHERE   SEGMENT_NAME='SYS_C004007';  
3j*V[-@.w0   
E&g&]P6k9Sp%v0    OWNER          SEGMENT_NAME           SEGMENT_TY           EXTENTS           INITIAL_EXTENT   NEXT_EXTENT   MAX_EXTENTS   PCT_INCREASE  51Testing软件测试网0S#M.A:LZ:w)s*L8O,X9M
    --------   ---------   ----------   ----------   --------------   -----------   -----------   ------------  
([Ge\l/p'p0    CHAOS         SYS_C004007          INDEX           2           1048576       1048576          100        0  51Testing软件测试网.B;AwG2{8L\
   51Testing软件测试网.AR,q!u)w Hz
    同样,我们也可以通过ALTER   TABLE来修改这个表,在加上主键约束的时候同时指定这个主键对应的索引得一些情况:  51Testing软件测试网 l kw N/OHuso,D
    SQL>   ALTER   TABLE   TEST   ADD   CONSTRAINT  
:V~[4Y8qo|2D0     2   PK1   PRIMARY   KEY   (NAME)  
p-G,Um/x {H;Duc q D0     3   USING   INDEX    
R6fWV%X0     4   TABLESPACE   INDEXS    51Testing软件测试网(eA@3[2` X\ I
     5   NOLOGGING  51Testing软件测试网 Bn h|q u/d
     6   INITRANS   20  51Testing软件测试网,^"O#j&diU"L
     7   STORAGE  
j@QS-S*WF0     8   (INITIAL   1M  51Testing软件测试网2xRl9G[+`
     9   NEXT   1M  
A6bX#M`ty:L0     10   MINEXTENTS   2  
8u-ukV)iq0     11   MAXEXTENTS   100  
H BG j}\0     12   );  51Testing软件测试网V+O8E2w^s_
   
]'LC} y$R2S nBM'K0    表已更改。  51Testing软件测试网1D yd$E(c
    同样可以通过查询系统表发现,这个索引已经使用了它自己的特性的一些参数。  
9e}/U'UCZ:X0    那么这两种方式究竟有没有差别呢?  
#A3j t;s)Se]0    应该说,这两种方式是完全等同的,但是后一种方法有更大的自由度。主要是考虑到有时候表上的索引可能是符合索引,即,有多个列共同组成一个表的主键。这种情况下,第一种方法就不可行了,因为这样加上的主键约束是不能针对多个列组成的主键的。  51Testing软件测试网H_ k3o d4d
    针对一个列组成的主键,那么这两种方法是完全一样的。

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar