col$資料字典中col#,segcol#,intcol#的意義

magic007發表於2008-01-19

讓實驗說話:

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#表示建立表時各列的定義順序。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69924/viewspace-153380/,如需轉載,請註明出處,否則將追究法律責任。

相關文章