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

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

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
  关于Oracle索引       51Testing软件测试网2e1PPx:\
  如何为你的表的主键、唯一性约束所创建的索引定义自己的表空间和别的参数?       51Testing软件测试网AX2p5}c
   51Testing软件测试网 A%B8G{)Sqk&KA
    Oracle里边,如果你在一张表上面加上了唯一性约束或者主键约束,Oracle会自动为那个表创建索引来保证这些约束的。  
IR#A5k5G*_"u-c(j0    比如下面的语句:  
ue"K9`#Dn9]g0    SQL>   CREATE   TABLE   TEST    51Testing软件测试网]` Sh'v M"siQtl%d%b
     2   (NAME   VARCHAR2   (20)   PRIMARY   KEY,  51Testing软件测试网f~1^:W VZ2An
     3   AGE   NUMBER);  51Testing软件测试网-VV TN v;GZ:o
   51Testing软件测试网 eNez%zK
    表已创建。  51Testing软件测试网?TqX'TraY
    可以用下面的语句看到,Oracle自动创建了一个叫做SYS_C004006   的索引:  51Testing软件测试网+x5] ~4A+E5O D,i
    SQL>   SELECT   INDEX_NAME,   TABLE_NAME,   tablespace_name   from   USER_INDEXES   WHERE   TABLE_NAME='TEST';  51Testing软件测试网 ~T)OnU|w:aa
   
t.nO9j M;V ? y0    INDEX_NAME        TABLE_NAME         TABLESPACE_NAME  
m4l"GhU5r c,F0    -----------------    -------------------- ----------------------  
|'G2O5x!r0f:?]0    SYS_C004006          TEST            TOOLS  
\:a/jR9z0   
Ok i \a,eeK l{%y0    这个时候,再看看DBA_SEGMENT,可以看到,这一切都是用了这个表空间的默认存储参数:  51Testing软件测试网6b~4z:r l6G\$G!Q
    SQL>SELECT   OWNER,   SEGMENT_NAME,   SEGMENT_TYPE,  51Testing软件测试网k}[_dP)`
      EXTENTS,   INITIAL_EXTENT,   NEXT_EXTENT,   MAX_EXTENTS,   PCT_INCREASE  51Testing软件测试网[ Jflo f[ ]
      FROM   DBA_SEGMENTS   WHERE   SEGMENT_NAME='SYS_C004006';  
? ^i:e$t*X!{ M0   51Testing软件测试网%d{-_2oESX tnB1?
    OWNER       SEGMENT_NAME       SEGMENT_TY      EXTENTS   INITIAL_EXTENT   NEXT_EXTENT         MAX_EXTENTS   PCT_INCREASE  51Testing软件测试网 PH'L |xC
    --------   -------------   ----------   ----------   --------------   -----------   -----------   ------------  
U_,}5`*] Ra0    CHAOS     SYS_C004006      INDEX       1        10240     10240     121            50  
(z1e$BxM0   51Testing软件测试网#w3`&XY(c z[b c
    对于大多数索引来说,这些存储参数并不合适,不利于系统的性能和维护。  
;MI@9p.co0    能不能对于这些索引像普通索引那样定义自己的表空间、存储参数呢?  51Testing软件测试网F(Z@4Oz5vW
    答案是肯定的,我们可以做到,这就要用到Oracle的创建表或者改变表语句中的一个USING   INDEX子句。  
@W zz1u a0    下面让我们来仔细分析这个子句的用法:  
yU6X.}8Tp|0      
+B9u-NXF$j._0    从这个图里我们可以看到,我们可以为这个索引指定很多具体的参数,而不必都服从Oracle的分配:我们可以指定INITRANS,MAXTRANS,TABLESPACE,LOGGING/NOLOGGING,以及具体的存储参数比如:         INITIAL,NEXT,MINEXTENTS,MAXEXTNETS,PCTINCREASE等等。  
&C4xJ:jCMp0    例子:  
Bif A vRH0    SQL>   CREATE   TABLE   TEST  
|(]ybA0     2   (NAME   VARCHAR2(30)   PRIMARY   KEY    
%Hu}8n(it6\z i*m0     3   USING   INDEX  51Testing软件测试网Z7j3P6Le-{ ]o(vj
     4   TABLESPACE   INDEXS    
Uv$Kn s*P0     5   PCTFREE   0  
`.~8h~%B%}8b2J0     6   STORAGE  
3eP'u@$JH)F9}0     7   (INITIAL   1M  51Testing软件测试网6r8h'R4sa,HyT7}
     8   NEXT   1M  51Testing软件测试网k'WQU6c(wF
     9   MINEXTENTS   2  
m mHSU#wf0     10   MAXEXTENTS   100  51Testing软件测试网Qq v#G6ZUi
     11   )  
2l5]"c v?0     12   ,  51Testing软件测试网"mT B#N9[:DD.u
     13   AGE   NUMBER);  
}@ f%qD@"R0   
r#V'g[j0    表已创建。  51Testing软件测试网#l*n+c li*F
    SQL>   SELECT   INDEX_NAME   FROM   USER_INDEXES   WHERE   TABLE_NAME='TEST';  51Testing软件测试网3i8GSE2P9c
   51Testing软件测试网p+@S kR,o$d4EaK O
    INDEX_NAME  51Testing软件测试网"q uFRaX~"BWX)S
    ------------------------------  51Testing软件测试网B:e:`uA$~_C
    SYS_C004007  51Testing软件测试网 FC(en K"U7V%U
   51Testing软件测试网 Mk9I?g
    SQL>                                     SELECT             OWNER,SEGMENT_NAME   ,SEGMENT_TYPE,EXTENTS,INITIAL_EXTENT,NEXT_EXTENT,MAX_EXTENTS,PCT_INCREASE  51Testing软件测试网4?K[/@8T"|A
    2   FROM   DBA_SEGMENTS   WHERE   SEGMENT_NAME='SYS_C004007';  51Testing软件测试网%p;O `UIV{'v%[o
   
:\|B Fu0    OWNER          SEGMENT_NAME           SEGMENT_TY           EXTENTS           INITIAL_EXTENT   NEXT_EXTENT   MAX_EXTENTS   PCT_INCREASE  
'@-pk.LI sy#@Jr0    --------   ---------   ----------   ----------   --------------   -----------   -----------   ------------  51Testing软件测试网.s|ch|'m]s+k
    CHAOS         SYS_C004007          INDEX           2           1048576       1048576          100        0  
d R~^M y%Cg0   51Testing软件测试网2ShBu'a-AdC
    同样,我们也可以通过ALTER   TABLE来修改这个表,在加上主键约束的时候同时指定这个主键对应的索引得一些情况:  
Y jf2|baB*H0    SQL>   ALTER   TABLE   TEST   ADD   CONSTRAINT  51Testing软件测试网4N#y.FR(VXcw
     2   PK1   PRIMARY   KEY   (NAME)  51Testing软件测试网:N)Kc-v?9mS
     3   USING   INDEX    
,V/n/Fj|0     4   TABLESPACE   INDEXS    51Testing软件测试网lQ;B_ lQ~+A X
     5   NOLOGGING  
,wZ/G'hbV}R2^{U0     6   INITRANS   20  51Testing软件测试网J G'pqXYw1mHR
     7   STORAGE  
@r2et/N9z Zy0     8   (INITIAL   1M  51Testing软件测试网\NREI#IJ
     9   NEXT   1M  51Testing软件测试网#b8Hw!d5~ b Y
     10   MINEXTENTS   2  
lu kN?ib:E'm.E0     11   MAXEXTENTS   100  
]:S9SK.i0     12   );  
Y LYp%bz0   
"XT{qGP@t"~r9[t"|M0    表已更改。  51Testing软件测试网.X0TG(O&j)B.S ~-Z7`
    同样可以通过查询系统表发现,这个索引已经使用了它自己的特性的一些参数。  51Testing软件测试网*B,D&t-V9v(I4I"w
    那么这两种方式究竟有没有差别呢?  51Testing软件测试网i+Vq;l3hZ7yl
    应该说,这两种方式是完全等同的,但是后一种方法有更大的自由度。主要是考虑到有时候表上的索引可能是符合索引,即,有多个列共同组成一个表的主键。这种情况下,第一种方法就不可行了,因为这样加上的主键约束是不能针对多个列组成的主键的。  
c0@R@"y*r"Q0    针对一个列组成的主键,那么这两种方法是完全一样的。

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar