发信人: chao_ping(canisaylove) 
整理人: tidycc(2001-03-11 19:07:52), 站内信件
 | 
 
 
如何为你的表的主键、唯一性约束所创建的索引定义自己的表空间和别的参数?
 
 在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   );
 
 表已更改。
 同样可以通过查询系统表发现,这个索引已经使用了它自己的特性的一些参数。
 那么这两种方式究竟有没有差别呢?
 应该说,这两种方式是完全等同的,但是后一种方法有更大的自由度。主要是考虑到有时候表上的索引可能是符合索引,即,有多个列共同组成一个表的主键。这种情况下,第一种方法就不可行了,因为这样加上的主键约束是不能针对多个列组成的主键的。
 针对一个列组成的主键,那么这两种方法是完全一样的。
 	
 
 
  ---- 看看vivian
 听听雨声
 很久没有这样了,
 唉,生活...... | 
 
 
 |