1、存儲user data
1)普通tables
2)partitioned tables
3)index-organized tables
4)Clustered tables:前面三種就不再敘述了,講講這個吧。clustered table提供了一種存儲table data的方法。一個cluster由一個或是一組tables組成,共享相同的data blocks,這主要是由于他們共享共同的columns并經常同時使用。其主要特點:
* 有cluster key,用于區分需要存儲在一起的rows
* cluster key可以包含一個或更多columns
* clustering機制相對于應用時透明的。
* 修改cluster key中的某個column,將會導致物理的重新分配
* cluster key相對于table的primary key是獨立的。
* 創建cluster是為了改善性能的。對于clustered data,隨機存取較快,但是對于全表掃描,clustered table將更慢。
* clusters只是重新組織了tables的物理存儲,并不影響邏輯結構。
2)數據類型
如上圖
①內建數據類型:
* 標量(scalar)數據類型
這里只描述幾個不常用的:timestamp data type(存儲date和time,包含9個小數位;其中TIMESTAMP和TIMESTAMP WITH LOCAL TIME ZONE可以被用于設置為primary key,但TIMESTAMP WITH TIME ZONE不可);raw data type(可以存儲小的二進制data,此類數據在network中傳輸時,不需要進行字符集的轉換);Oracle還提供了6中數據類型用于存儲LOBs(CLOB和LONG存放定長的字符data;NCLOB用于存放定長本地字符集數據;BLOB和LONG RAW用于存放非結構化的data;BFILE存放OS文件中的非結構化數據)
note:ROWID是只用于查詢的字段,是database中每一行data的唯一標識,是隱式存儲在表中的,提供最快的訪問方法,此外還會存儲在index segments中,用于index的查詢。
UROWID是在8.1版本中新增的,用于支持外表的rowid,可以存儲在所有類型的rowid中。(這里沒太搞懂啊~~~~(>_<)~~~~ )
* 集合(collections)數據類型:
# varying arrays(VARRAY):用于存儲有少量數據元素的lists,它是數據元素的有序集合;在其中的所有元素的數據類型應該是一致的;每個元素都有一個與其位置相關聯的index;元素的個數決定了varray的大小;其大小是可變的,但是在聲明后Maximum size必須確定了。
# Nested Tables:提供了一種方法,將一個子表作為父表中的一個column的值。nested Table是一個records或rows的無序集合;存儲在nested table中的數據應該有一致的結構;nested table中的rows與父表的存儲是分離的;父表中只記錄了nested table的pointer;nested table的存儲特征可以由DBA來指定;對nested table沒有Maximum size的限制。
* 關系(relationship)數據類型(REFs):此類數據主要在database中做pointer。
* 此外Oracle Server運行user定義自己的數據類型。
2、ROWID的格式
1)extended的rowid:需要占用disk上的10bytes來存儲,顯示時,將使用18個字符。主要由以下四部分組成:
* data object number:標識了每個data的object。在table或是index等objects被創建時,會分配給其一個database全局唯一的number。
* relative file number:在一個tablespace中的每個file的number是唯一的
* block number:指明了在該file中包含此row的block的位置
* row number:指明了在block header中該row的目錄槽(directory slot)的位置
在內部,data object number需要32 bits,relative file number 10 bits,block number 22 bits, row number 16 bits。總共80bits,即10 bytes。
entended rowid的顯示是以16進制來顯示的,一共18個字符,前6個位data object number,三個relative file number,六個block number,三個row number。
2)restricted rowid:是在Oracle7和更早的版本中使用的。內部只使用6 bytes。具體如圖。此外在后期的版本中對于建立在非partition tables上的非partition index使用的仍是restricted rowid。
3)使用rowid定位row的位置
因為每個segment只能存儲在一個tablespace中,所以使用data object number就可以確定具體的tablespace。使用file number確定相應tablespace中的data file。最后使用block number和row number進行定位
row data被變長的存儲在database blocks中。每條row中的columns會按照表定義的順序存儲,并且任何值為NULL的columns不會被存儲,所以每一row種的columns數可能是不同的。如圖,one row都會有一個row header(用于存放該row中的columns數量、連接信息、row lock狀態)、row data(其中,每個column,都會存儲column的長度和其value)。臨界的rows之間不需要留空間。在block中每個row都對應一個row directory,用于指向row的開始位置。
3、create table
1)
* 關系型表:存儲user data 的基本表
* object table
都可以使用create table語句創建
note:在自己的schema上創建table,需要有create table權限,在其他user的schema上創建需要有create any table權限。
CREATE TABLE t_name(
col1 COL_TYPE,
…
)STORAGE ( INITIAL n[K|M] NEXT n[K|M] PCTINCREASE n MINEXTENTS n MAXEXTENTS n) [pctfree integer] [pctused integer][initrans integer] [maxtrans integer] TABLESPACE tsp_name;
2)創建臨時表
* transaction-specific temporary tables:數據在當前transaction中存在。
* session-specific temporary tables:數據存儲在當前session存在的期間。
不同session中的data是隔離的。所以在temporary tables中不需要使用DML locks對data加鎖。并且DMLs也不會產生redo log。可以在臨時表上創建indexes、views、triggers,也可以使用export和import,但使用export得到的是沒有data本身的。臨時表的定義是在所有session中可見的。
CREATE GLOBAL TEMPORARY TABLE t_name … [ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS]
4、其他table的維護操作
1)手工分配extents
* 主要用于兩種情況:控制table上extents的分布到指定的file上;在loading大量數據時避免動態的進行extended。
* ALTER TABLE [schema]table ALLOCATE EXTENT [([SIZE integer [K|M]][DATAFILE 'filename'])]
如果沒有指定SIZE參數,則會使用建表時的NEXT_EXTENT的大小來extended。
2)重組nonpartitioned table
nonpartitioned table可以在不用使用的export和import的情況下被move,同時它允許改變部分存儲參數。主要用于下面的情況:
* 將一個table從一個tablespace移動到另一個tablespace
* 通過重組table消除其中的migration rows
但是在重組后需要rebuild indexes,否則使用indexes進程的操作將會報錯
ALTER TABLE (schema)table MOVE TABLESPACE tsp_name;
3)truncate table
TRUNCATE TABLE [schema.]table [{DROP | REUSE} STORAGE]
該操作將刪除table中的所有rows,并且會釋放所使用的space,不會產生undo data,并進行了隱式的commit(因為它是一個DDL)。其table相對應的indexes也被刪除了。但是如果一個table正在被其他的table最為foreign key參照,則不能被truncate。并且該table上相應的delete triggers將失效。DROP會移動高水位線,但是REUSE不會。
4)drop table
DROP TABLE [schema.]table [CASCADE CONSTRAINTS]
如果該table在外鍵關系中是父表,則必須指定CASCADE CONSTRAINTS。
5)drop a column
ALTER TABLE [schema.]table DROP COLUMN col_name [CASCADE CONSTRAINTS CHECKPOINT n]
該操作會清除 columns不再使用的space,重建indexes和constraints,時間開銷較大。在8i之前,是沒有此類操作的。
因為此操作耗時長,會產生大量的undo data。此時可以指定checkpoints,從而minimize所需的undo space。checkpoint子句指明每進行n行的update操作,會產生一個checkpoint。并且在進行drop columns時,table會標記為invalid,直到操作完成。
如果操作被中途中斷,可以使用下面的語句進行:
ALTER TABLE [schema.]table DROP COLUMNS CONTINUE;
6)使用unused option
除了drop columns,還可以將column標識為unused,此操作因為不會收回空閑不用的space,所以相對快些。被標識位unused的columns可隨后被drop。被unused的columns,將無法被查詢語句訪問,describe也無法看到,user可以add一個有相同name的column。
當想要drop兩個或以上的columns時,可以將其先設置為unused,在一起刪除,更節省時間。
* ALTER TABLE [schema.]table SET UNUSED COLUME col_name CASCADE CONSTRAINTS;
* ALTER TABLE [schema.]table DROP UNUSED COLUMNS CHECKPOINT n;
* ALTER TABLE [schema.]table DROP COLUMNS CONTINUE CHECKPOINT n;
查看被標識為unused的columns時,可以查看視圖DBA_UNUSED_COL_TABS。
SELECT * FROM dba_unused_col_tabs;
查看完成了部分drop columns操作而被中斷的columns信息,可以查看DBA_PARTIAL_DROP_TABS;
SELECT * FROM dba_partial_drop_tabs;
note:drop column受到下面的限制:
@ 不可從object type table中drop column
@ 不可刪除nested tables中的columns
@ 不可drop一個表中的所有columns
@ 不可drop partitioning key columns
@ 不可drop 屬于SYS的tables中的columns
@ 不可drop parent key column
@ 不可drop組織索引表中的primary key所在column
@ 在表中,如果LONG或是LONG RAW字段被標識為unused,但沒有被drop,則會妨礙新的LONG或是LONG RAW字段被刪除。
5、獲得tables的information
主要是查看視圖DBA_TABLES和DBA_OBJECTS
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
