Oracle9i下將列設為UNUSED時的系統行為
下面以例子說話:
SQL> create table test1.unused_test as select rownum a,rownum*2 b,rownum*10 c from dba_objects where rownum<=100;
Table created.
看看資料字典:
SQL> select column_name,data_type,column_id,hidden_column,segment_column_id seg_
cid,internal_column_id internal_cid from dba_tab_cols where wner='TEST1' and ta
ble_name='UNUSED_TEST';
COLUMN_NAM DATA_TYPE COLUMN_ID HIDDEN SEG_CID INTERNAL_CID
---------- -------------------- --------- ------ ---------- ------------
A NUMBER 1 NO 1 1
B NUMBER 2 NO 2 2
C NUMBER 3 NO 3 3
SQL> select column_name,data_type,column_id from dba_tab_columns where wner='TE
ST1' and table_name='UNUSED_TEST';
COLUMN_NAM DATA_TYPE COLUMN_ID
---------- -------------------- ---------
A NUMBER 1
B NUMBER 2
C NUMBER 3
SQL> select object_id from dba_objects where wner='TEST1' and object_name='UNUS
ED_TEST' and object_type='TABLE';
OBJECT_ID
----------
6577
SQL> select col#,segcol#,name,intcol# from col$ where obj#=6577;
COL# SEGCOL# NAME INTCOL#
---------- ---------- ---------- ----------
1 1 A 1
2 2 B 2
3 3 C 3
通過DUMP資料庫檔案塊可以看到每行有三列(這裡不再列出DUMP檔案內容)
下面將B列置為unused狀態:
SQL> alter table test1.unused_test set unused (b);
Table altered.
SQL> select column_name,data_type,column_id,hidden_column,segment_column_id seg_
cid,internal_column_id internal_cid from dba_tab_cols where wner='TEST1' and ta
ble_name='UNUSED_TEST';
COLUMN_NAME DATA_T COLUMN_ID HIDDEN SEG_CID INTERNAL_CID
---------------------------- ------ --------- ------ ---------- ------------
A NUMBER 1 NO 1 1
SYS_C00002_08011915:24:34$ NUMBER YES 2 2
C NUMBER 2 NO 3 3
這裡原來的B列,其名字為系統自動生成的一列,命名形式為SYS_CNNNNN_YYMMDDHH24:MI:SS$,NNNNN為原來的COLUMN_ID,前面補0補足成5數。hidden已經變為YES,COLUMN_ID為空。其他兩列A和C的COLUMN_ID順序作了調整。這三列的SEGMENT_COLUMN_ID和INTERNAL_COLUMN_ID沒有變化。
SQL> select column_name,data_type,column_id from dba_tab_columns where wner='TE
ST1' and table_name='UNUSED_TEST';
COLUMN_NAME DATA_T COLUMN_ID
---------------------------- ------ ---------
A NUMBER 1
C NUMBER 2
在DBA_TAB_COLUMNS檢視中,B列已經沒有顯示出來。
SQL> select col#,segcol#,name,intcol# from col$ where obj#=6577;
COL# SEGCOL# NAME INTCOL#
---------- ---------- ---------------------------- ----------
1 1 A 1
0 2 SYS_C00002_08011915:24:34$ 2
2 3 C 3
這裡B列的COL#已經變成0.SEGCOL#和INTCOL#列沒有變化,NAME也已經變化
DUMP出來的資料中,每一行仍然有三列。
嘗試插入資料:
SQL> insert into test1.unused_test values (1234,4321,1);
insert into test1.unused_test values (1234,4321,1)
*
ERROR at line 1:
ORA-00913: too many values
SQL> insert into test1.unused_test values (1234,4321);
1 row created.
SQL> select rowid from test1.unused_test where a=1234 and c=4321;
ROWID
------------------
AAABmxAAFAAAAEuAAA
此ROWID對應的rfile#為5,block#為302,row number為0
DUMP出這一塊檢視第0行資料,發現在資料塊中每行仍然是3列,第二列也就是原來的B列其值為NULL。
現在我們將C列刪除:
SQL> alter table test1.unused_test drop (c);
Table altered.
SQL> select column_name,data_type,column_id,hidden_column,segment_column_id seg_
cid,internal_column_id internal_cid from dba_tab_cols where wner='TEST1' and ta
ble_name='UNUSED_TEST';
COLUMN_NAME DATA_T COLUMN_ID HIDDEN SEG_CID INTERNAL_CID
---------------------------- ------ --------- ------ ---------- ------------
A NUMBER 1 NO 1 1
這裡可以看出B列和C列都已經刪除。
SQL> select column_name,data_type,column_id from dba_tab_columns where wner='TE
ST1' and table_name='UNUSED_TEST';
COLUMN_NAME DATA_T COLUMN_ID
---------------------------- ------ ---------
A NUMBER 1
SQL> select col#,segcol#,name,intcol# from col$ where obj#=6577;
COL# SEGCOL# NAME INTCOL#
---------- ---------- ---------------------------- ----------
1 1 A 1
都可以看出B列和C列已經被刪除。從這個實驗就可以看出,在刪除C時會將UNUSED列一併刪除。
DUMP出資料塊可以發展,塊中每一行只有1列。因此SET UNUSED只是修改了資料字典,速度較多。而將COLUMN DROP掉,不僅修改資料字典,而且修改實際的塊資料。如果表比較大,會耗費比較長的時間。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69924/viewspace-153373/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 恢復被設定為Unused的欄位
- 為建設而建設 ,為系統而系統
- Oracle9i spfile 中如何用修改系統重置命令將引數值重置為預設值Oracle
- Win10系統下如何將mail郵件設為中文版Win10AI
- win10系統下將印表機紙張大小設為24*9的方法Win10
- 將redis作為windows系統的系統服務RedisWindows
- PowerShell定時記錄作業系統行為作業系統
- win10系統下怎麼將OneNote設定為桌面版Win10
- winxp系統下將指定輸入法怎麼設定為預設輸入法
- [譯] 將 React 作為 UI 執行時ReactUI
- Windows10系統將效能設定為最佳模式的方法Windows模式
- win10系統下將照片檢視器設定為預設開啟圖片的方法Win10
- 系統為什麼會在執行時當機
- win10系統下將使用者設定為管理員許可權的方法Win10
- Win10系統下怎麼將普通賬戶設定為管理員賬戶Win10
- 影片智慧行為分析系統
- Linux系統行為新型實時監控技術Linux
- 將多列值轉換為一行顯示
- 將所配置的初始化引數重置為系統預設值
- win10電腦怎麼將mac設定為預設系統Win10Mac
- 【逆水寒】多方任務系統的資訊架構與行為引導設計——以懸賞系統為例架構
- 人員行為識別系統
- 監控影片行為分析系統
- win10系統下將邏輯分割槽改為主分割槽的方法Win10
- Win10系統下將excel檔案轉換為dbf檔案的方法Win10Excel
- 將一個Collection轉為陣列陣列
- JavaScript將陣列轉換為字串JavaScript陣列字串
- 設定Oracle9i為自動歸檔模式Oracle模式
- win10系統下將360瀏覽器設定為預設瀏覽器無效如何解決Win10瀏覽器
- 設計開發時慎重決定列是否為空
- 從《英雄聯盟》的裝備系統談玩家行為與遊戲設計遊戲設計
- 為何你的系統不能穩定執行?
- 線上消費行為統計與分析系統設計和實現
- Excel將一列資料變為兩列Excel
- jQuery將類陣列物件轉換為陣列jQuery陣列物件
- 抽菸行為監測識別系統
- 抽菸行為識別預警系統
- Win10系統下設定IE為預設瀏覽器的2種方法Win10瀏覽器