精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 数据库技术>>Oracle产品>>好好管理你的索引。

主题:好好管理你的索引。
发信人: 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
听听雨声
很久没有这样了,
唉,生活......

[关闭][返回]