能否描述一下索引的原理,最好能介绍索引表的结构
上一篇 / 下一篇 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'vM"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:a a
t.nO9jM;V? y0 INDEX_NAME TABLE_NAME TABLESPACE_NAME
m4l"Gh U5r 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软件测试网[Jflof[ ]
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(cz[b c
对于大多数索引来说,这些存储参数并不合适,不利于系统的性能和维护。
;MI@9p.co0 能不能对于这些索引像普通索引那样定义自己的表空间、存储参数呢? 51Testing软件测试网F(Z@4Oz5vW
答案是肯定的,我们可以做到,这就要用到Oracle的创建表或者改变表语句中的一个USING INDEX子句。
@W zz1ua0 下面让我们来仔细分析这个子句的用法:
yU6X.}8Tp|0
+B9u-NXF$j._0 从这个图里我们可以看到,我们可以为这个索引指定很多具体的参数,而不必都服从Oracle的分配:我们可以指定INITRANS,MAXTRANS,TABLESPACE,LOGGING/NOLOGGING,以及具体的存储参数比如: INITIAL,NEXT,MINEXTENTS,MAXEXTNETS,PCTINCREASE等等。
&C4xJ:jCMp0 例子:
Bif AvRH0 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]"cv?0 12 , 51Testing软件测试网"mTB#N9[:DD.u
13 AGE NUMBER);
}@ f%q D@"R0
r#V'g[j0 表已创建。 51Testing软件测试网#l*n+cli*F
SQL> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME='TEST'; 51Testing软件测试网3i8GSE2P9c
51Testing软件测试网p+@S kR,o$d4EaK O
INDEX_NAME 51Testing软件测试网"quFRaX~"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 `UI V{'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
如何为你的表的主键、唯一性约束所创建的索引定义自己的表空间和别的参数? 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'vM"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:a a
t.nO9jM;V? y0 INDEX_NAME TABLE_NAME TABLESPACE_NAME
m4l"Gh U5r 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软件测试网[Jflof[ ]
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(cz[b c
对于大多数索引来说,这些存储参数并不合适,不利于系统的性能和维护。
;MI@9p.co0 能不能对于这些索引像普通索引那样定义自己的表空间、存储参数呢? 51Testing软件测试网F(Z@4Oz5vW
答案是肯定的,我们可以做到,这就要用到Oracle的创建表或者改变表语句中的一个USING INDEX子句。
@W zz1ua0 下面让我们来仔细分析这个子句的用法:
yU6X.}8Tp|0
+B9u-NXF$j._0 从这个图里我们可以看到,我们可以为这个索引指定很多具体的参数,而不必都服从Oracle的分配:我们可以指定INITRANS,MAXTRANS,TABLESPACE,LOGGING/NOLOGGING,以及具体的存储参数比如: INITIAL,NEXT,MINEXTENTS,MAXEXTNETS,PCTINCREASE等等。
&C4xJ:jCMp0 例子:
Bif AvRH0 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]"cv?0 12 , 51Testing软件测试网"mTB#N9[:DD.u
13 AGE NUMBER);
}@ f%q D@"R0
r#V'g[j0 表已创建。 51Testing软件测试网#l*n+cli*F
SQL> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME='TEST'; 51Testing软件测试网3i8GSE2P9c
51Testing软件测试网p+@S kR,o$d4EaK O
INDEX_NAME 51Testing软件测试网"quFRaX~"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 `UI V{'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