让实验说话:
SQL> create cluster test1.C_T1 ( c_a number(10));
Cluster created.
SQL> create index test1.c_t1_idx on cluster test1.c_t1;
Index created.SQL> create table test1.t1 (a varchar(2),b number(10),c varchar2(10)) cluster te
st1.c_t1 (b);
Table created.
SQL> select object_id from dba_objects where object_name='T1';
OBJECT_ID
----------
6591
SQL> select col#,name,segcol#,intcol# from col$ where obj#=6591;
COL# NAME SEGCOL# INTCOL#
---------- ---------------------------- ---------- ----------
1 A 2 1
2 B 1 2
3 C 3 3
这里可以看到,intcol#为创建表时的列顺序,col#初始情况下跟intcol#相同。而segcol#表示列在数据段上存储时的顺序。由于这是一个聚簇表,因此在存储时最前的列就是聚簇列。(这里为列B)
SQL> alter table test1.t1 set unused (a);
Table altered.
SQL> select col#,name,segcol#,intcol# from col$ where obj#=6591;
COL# NAME SEGCOL# INTCOL#
---------- ---------------------------- ---------- ----------
0 SYS_C00001_08011917:03:19$ 2 1
1 B 1 2
2 C 3 3
这里可以看到,在将列设为UNUSED之后,COL#变为0,其余的列的COL#重新排序。而此时该列在数据段上并没有被删除掉,因此其SEGCOL#列仍然保持原来的值。
SQL> alter table test1.t1 add ( d varchar2(10));
Table altered.
SQL> select col#,name,segcol#,intcol# from col$ where obj#=6592;
COL# NAME SEGCOL# INTCOL#
---------- ---------------------------- ---------- ----------
0 SYS_C00001_08011917:03:19$ 2 1
1 B 1 2
2 C 3 3
3 D 4 4
SQL> alter table test1.t1 drop(c);
Table altered.
SQL> select col#,name,segcol#,intcol# from col$ where obj#=6592;
COL# NAME SEGCOL# INTCOL#
---------- ---------------------------- ---------- ----------
1 B 1 1
2 D 2 2
删除列后,这三个字段均重新进行了排列。
结论:COL#可以表示该列是否在用(0为UNUSED),SEGCOL#表示各列在数据块上存储时的顺序,INTCOL#表示创建表时各列的定义顺序。
no comment untill now