Oracle資料庫開發——表(概念)

呆呆笨笨的魚發表於2014-04-17
在Oracle資料庫系統中,表是資料庫的基本物件,資料庫中所有資料都是以表的形式存在的。

環境——Oracle 11g
一.表的型別
Oracle資料庫系統中常用的表包括:堆組織表、索引組織表、聚簇表(索引、雜湊、有序雜湊)、巢狀表、臨時表、外部表、分割槽表、物件表等。

1.堆組織表
在Oracle系統中,普通的標準資料庫表就是堆組織表,其中的資料以堆的方式管理。
堆的含義:以隨機方式儲存資料的一組空間。
對於堆組織表而言,當進行資料寫入時,資料庫會使用段中第一個足夠的自由空間。
                  當進行資料刪除時,系統允許以後的插入和更新操作重用這部分空間。
                  
2.索引組織表
索引組織表(index organized table,ITO)是按照索引結構儲存資料庫的表,這樣可以提高查詢效能。
與堆組織表的隨意性不同,索引組織表要求資料行本身具有某種物理順序,資料只能根據主鍵有序地儲存。這樣在索引組織表中執行查詢操作時,
使用主鍵列將會得到較好的讀取效能。

3.聚簇表
聚簇,是指一個或多個表組成的組,這些表物理地儲存在相同的資料塊上,有相同聚簇鍵值的所有行會相鄰地物理儲存。
利用聚簇表可以實現將多個表相關的資料儲存在一個資料塊中,還可以實現把相同聚簇鍵值的所有資料預先儲存起來,如果多個表經常
做連結操作,採用聚簇表可以大大提高檢索效能。
oracle 11g提供三種聚簇表:
a.索引聚簇表(Index Cluster Table):基於B-Tree索引聚簇鍵而建立的聚簇表。聚簇鍵指向一個oracle塊,而不是一行資料。
b.雜湊聚簇表(Hash Cluster Table):使用雜湊函式代替B-Tree索引的聚簇鍵索引,表中的資料就是索引。
在雜湊聚簇表中,首先透過內部函式或自定義函式進行雜湊計算,然後將計算得到的碼值用於定位表中的資料行。
如果經常使用有相同的包含相等條件的查詢子句訪問表時,使用雜湊聚簇很合適。
c.有序雜湊聚簇表(Sorted Hash Cluster Table):這種雜湊聚簇表是Oracle 10g增加的,它不僅有雜湊聚簇的性質,還結合了IOT的一些性質。
如果需要按照某個鍵獲取資料,但是要求這些資料按另外一個列排序,這種情況下適合用有序雜湊聚簇表。透過使用有序雜湊聚簇表,
oracle可以不用排序而查詢到資料,因為其中的資料時按照鍵的有序物理儲存的。

4.巢狀表
巢狀表是表中之表,是Oracle物件關係擴充套件的一部分,他們是系統生成和維護的父/子關係中的子表。
巢狀表和子表的區別:子表是獨立的表,而巢狀表則不是。一個巢狀表是某些行的集合,它在父表中表示為其中一列。對父表中的每一條記錄
巢狀表可以包含多個行。
巢狀表的優點是能夠對他們進行索引和不需要連線,缺點是,儘管有級聯刪除形式(主行刪除時將刪除所有從屬行),但是引用完整性約束是不可能的。

5.臨時表
臨時表中儲存的是事務處理期間或會話期間的臨時資料,當事務處理完畢或會話結束,臨時表中的資料就被刪除。臨時表一旦建立就可以在需要
時使用,並且只有向表中插入資料時系統才從當前使用者的臨時表空間為它分配儲存區段。
臨時表包括:會話級臨時表和事務級臨時表。
            會話級臨時表在會話沒有斷開之前,其中的資料不會自動刪除,會話結束後被系統自動刪除。
            事務級臨時表在事務提交時會被系統自動刪除。

6.外部表
這是從Oracle 9i開始增加的表型別,外部表中的資料並不儲存在資料庫本身中,而是放在資料庫之外的檔案系統中。
利用外部表可以查詢資料庫之外的一個檔案,可以向資料庫載入資料以及寫在資料。在Oracle 10g中對外部表做了進一步的改進,引入了
解除安裝功能,這樣可以在不使用資料庫連結的情況下,為資料庫之間移動資料提供了一種簡單的方法。

7.分割槽表
分割槽就是將一個非常大的表分成若干個獨立的較小的組成部分進行儲存和管理。對錶進行分割槽後,表中的記錄將根據分割槽條件分散儲存
到不同的分割槽中,使用者可以對整個表進行操作,也可以針對特定的分割槽進行操作。一般表大小超過2GB時,應該使用分割槽表;此外,如果表中
包含歷史資料,則新的資料被增加到新的分割槽中。

8.物件表
物件表是基於物件型別建立的表,而不是作為列的集合。物件表中的每一行都是一個物件;每一個物件都有一個標示符(Object Identifier OID)
來唯一標識。在物件表之間沒有主外來鍵關聯的概念,為了體現這層關係,Oracle使用REF物件來實現。使用物件表可以簡化物件的使用,此外物件表
是使用物件型別作為模板來建立表的一種便捷方式,它可以確保多個表具有相同的結構。


二.表的特性
表的特性將決定怎樣建立表、怎樣在磁碟上儲存表,以及當表生成和可以使用之後,應用中最終執行的方式。
(1)TABLESPACE子句
預設情況下,使用者建立的表位於使用者或資料庫預設表空間(USER表空間)上。單使用者可以在建立表時,指定代建表的表空間。

(2)STORAGE子句
STORAGE子句多數是在建立表空間時,用來設定表空間的儲存屬性的。預設情況下,建立在該表空間的資料庫物件,都會繼承表空間的儲存屬性。
使用者可以在建立表的時候使用STORAGE子句來另外設定表的儲存屬性。
例:create table t_name(...)STORAGE (INITIAL 200K NEXT 200K PCTINCREASE 20 MAXEXTENTS 15);

INITIAL: 指出為物件分配的第一個區的大小

NEXT: 指出為物件分配的下一個區的大小

PCTINCREASE: 在本地管理表空間內,Oracle資料庫在建立段時使用該引數的值確定初始段大小,而後續分配的空間將忽略該引數的值。
            在字典管理表空間內,該引數的值指出第三個及其後續區比前一個區增長的百分比。

MINEXTENTS: 在本地管理表空間內,它與前面3個引數一起決定初始段(Segment)的大小。
           在字典管理表空間內,其值指出物件建立時分配的區總數。

MAXEXTENTS: 該引數只用於字典管理表空間,它指出Oracle可分配給物件的總區(Extent)數。

(3)LOGGING和NOTLOGGING
使用LOGGING和NOTLOGGING子句指定表是否是日誌記錄表。
LOGGING子句,系統會記錄資料庫中所有資料庫改變,一旦發生故障,可以從重做日誌中獲取這些改變,防止資料丟失,提高資料庫的可靠性。

NOTLOGGING子句,則不會記錄該表上的某些操作日誌,這樣就只產生很少的日誌。注意,並不是說使用NOTLOGGING子句,在表上的操作就全部
            不產生重做日誌。
            一般NOTLOGGING子句只對一下操作起作用:create table as select;
                                                     SQL*loader直接路徑載入;
                                                     直接路徑插入;
                                                     
(4)CACHE和NOCACHE
CACHE子句用來設定對錶進行全表搜尋時,將資料庫讀入緩衝區,並且放置到最近最常使用的一端。
NOCACHE子句則表示讀入緩衝區的資料庫被放置到最近最少使用列表的最近最少使用的一端。
預設情況下建立的表都是NOCACHE。對於頻繁進行全表搜尋的表,可以設定為CACHE。


三.建立表的基本語法
create table [schema.]table_name
(
    column_name  datatye [default expr]  [constraint_name] constraint_def   --列1
  ,column_name  datatye [default expr]  [constraint_name] constraint_def   --列2
  ...
   ,column_name  datatye [default expr]  [constraint_name] constraint_def   --列n
)
[PCTFREE n]
[PCTUSED n]
[INITRANS]
[STORAGE storage]
[TABLESPACE table_space]
[as sub_querry]
;
備註:
PCTFREE 用於的空間百分比(0~99),0表示插入式完全填滿資料塊,預設為10;
PCTUSED 為表的每個資料庫保留的可用空間的最小百分比(1~99),預設為40;
PCTFREE和PCTUSED的組合決定了將插入的資料是否放入一個新的資料塊中。

INITRANS 指出在分配給資料庫物件的每個資料塊內分配的最初併發事務項數,其取值為1~255,預設為1;


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

相關文章