引用:
关于Oracle索引   
如何为你的表的主键、唯一性约束所创建的索引定义自己的表空间和别的参数?     Oracle里边,如果你在一张表上面加上了唯一性约束或者主键约束,Oracle会自动为那个表创建索引来保证这些约束的。
  比如下面的语句:
  SQL> CREATE TABLE TEST 
   2 (NAME VARCHAR2 (20) PRIMARY KEY,
   3 AGE NUMBER);  表已创建。
  可以用下面的语句看到,Oracle自动创建了一个叫做SYS_C004006 的索引:
  SQL> SELECT INDEX_NAME, TABLE_NAME, tablespace_name from USER_INDEXES WHERE TABLE_NAME='TEST';  INDEX_NAME      TABLE_NAME       TABLESPACE_NAME
  -----------------  -------------------- ----------------------
  SYS_C004006        TEST          TOOLS  这个时候,再看看DBA_SEGMENT,可以看到,这一切都是用了这个表空间的默认存储参数:
  SQL>SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE,
    EXTENTS, INITIAL_EXTENT, NEXT_EXTENT, MAX_EXTENTS, PCT_INCREASE
    FROM DBA_SEGMENTS WHERE SEGMENT_NAME='SYS_C004006';  OWNER     SEGMENT_NAME     SEGMENT_TY    EXTENTS INITIAL_EXTENT NEXT_EXTENT       MAX_EXTENTS PCT_INCREASE
  -------- ------------- ---------- ---------- -------------- ----------- ----------- ------------
  CHAOS   SYS_C004006    INDEX     1      10240   10240   121            50  对于大多数索引来说,这些存储参数并不合适,不利于系统的性能和维护。
  能不能对于这些索引像普通索引那样定义自己的表空间、存储参数呢?
  答案是肯定的,我们可以做到,这就要用到Oracle的创建表或者改变表语句中的一个USING INDEX子句。
  下面让我们来仔细分析这个子句的用法:
  
  从这个图里我们可以看到,我们可以为这个索引指定很多具体的参数,而不必都服从Oracle的分配:我们可以指定INITRANS,MAXTRANS,TABLESPACE,LOGGING/NOLOGGING,以及具体的存储参数比如:       INITIAL,NEXT,MINEXTENTS,MAXEXTNETS,PCTINCREASE等等。
  例子:
  SQL> CREATE TABLE TEST
   2 (NAME VARCHAR2(30) PRIMARY KEY 
   3 USING INDEX
   4 TABLESPACE INDEXS 
   5 PCTFREE 0
   6 STORAGE
   7 (INITIAL 1M
   8 NEXT 1M
   9 MINEXTENTS 2
   10 MAXEXTENTS 100
   11 )
   12 ,
   13 AGE NUMBER);  表已创建。
  SQL> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME='TEST';  INDEX_NAME
  ------------------------------
  SYS_C004007  SQL>                                   SELECT           OWNER,SEGMENT_NAME ,SEGMENT_TYPE,EXTENTS,INITIAL_EXTENT,NEXT_EXTENT,MAX_EXTENTS,PCT_INCREASE
  2 FROM DBA_SEGMENTS WHERE SEGMENT_NAME='SYS_C004007';  OWNER        SEGMENT_NAME         SEGMENT_TY         EXTENTS         INITIAL_EXTENT NEXT_EXTENT MAX_EXTENTS PCT_INCREASE
  -------- --------- ---------- ---------- -------------- ----------- ----------- ------------
  CHAOS       SYS_C004007        INDEX         2         1048576     1048576        100      0  同样,我们也可以通过ALTER TABLE来修改这个表,在加上主键约束的时候同时指定这个主键对应的索引得一些情况:
  SQL> ALTER TABLE TEST ADD CONSTRAINT
   2 PK1 PRIMARY KEY (NAME)
   3 USING INDEX 
   4 TABLESPACE INDEXS 
   5 NOLOGGING
   6 INITRANS 20
   7 STORAGE
   8 (INITIAL 1M
   9 NEXT 1M
   10 MINEXTENTS 2
   11 MAXEXTENTS 100
   12 );  表已更改。
  同样可以通过查询系统表发现,这个索引已经使用了它自己的特性的一些参数。
  那么这两种方式究竟有没有差别呢?
  应该说,这两种方式是完全等同的,但是后一种方法有更大的自由度。主要是考虑到有时候表上的索引可能是符合索引,即,有多个列共同组成一个表的主键。这种情况下,第一种方法就不可行了,因为这样加上的主键约束是不能针对多个列组成的主键的。
  针对一个列组成的主键,那么这两种方法是完全一样的。