引用:
关于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 ); 表已更改。
同样可以通过查询系统表发现,这个索引已经使用了它自己的特性的一些参数。
那么这两种方式究竟有没有差别呢?
应该说,这两种方式是完全等同的,但是后一种方法有更大的自由度。主要是考虑到有时候表上的索引可能是符合索引,即,有多个列共同组成一个表的主键。这种情况下,第一种方法就不可行了,因为这样加上的主键约束是不能针对多个列组成的主键的。
针对一个列组成的主键,那么这两种方法是完全一样的。
关于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 ); 表已更改。
同样可以通过查询系统表发现,这个索引已经使用了它自己的特性的一些参数。
那么这两种方式究竟有没有差别呢?
应该说,这两种方式是完全等同的,但是后一种方法有更大的自由度。主要是考虑到有时候表上的索引可能是符合索引,即,有多个列共同组成一个表的主键。这种情况下,第一种方法就不可行了,因为这样加上的主键约束是不能针对多个列组成的主键的。
针对一个列组成的主键,那么这两种方法是完全一样的。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货