資料庫表——EXPERT ONE-ON-ONE ORACLE

zyb200發表於2007-05-22
Tom從表的基本儲存引數:FREELISTS、PCTFREE、PCTUSED、INITIAL、NEXT、PCTINCREASE、MINEXTENTS、MAXEXTENTS、LOGGING、NOLOGGING、INITRANS和MAXTRANS開始介紹,然後依次對堆表、索引組織表、聚簇表、雜湊聚簇表、巢狀表、臨時表和物件表進行了講解和說明。[@more@]

堆表:最常使用的普通表,資料的儲存沒有順序,當增加資料時會使用Oracle找到的第一個合適空間。

索引組織表:按照主鍵的順序儲存資料。對於可以透過主鍵訪問的表特別有效。但是由於索引組織表要維護主鍵的順序,因此DML操作對索引組織表來說代價比堆表要大,對於頻繁修改的表不適合建立為索引組織表。

聚簇表:又叫索引聚簇表。許多表包含一個相同的列,並且根據這個列儲存在一起。聚簇表在物理上將資料連線在一起,對於經常連線在一起訪問的表來說,聚簇表可以明顯的降低I/O。不過聚簇表不適合全部掃描操作,因為不得不掃描聚簇在一起的其他表的資料。而且對聚簇表的DML操作代價比較大,因此,聚簇表也不適合頻繁修改。

雜湊聚簇表:和聚簇表類似,不同的是雜湊函式替代了聚簇索引。雜湊聚簇表可以透過雜湊函式直接定位到一條記錄的物理儲存位置,一般情況下雜湊聚集只需要一次I/O就可以讀取到指定的記錄。但是雜湊聚簇不支援範圍查詢,因為一個範圍之間存在著無數的可能性。而且雜湊函式的大小是預先計算好的,因此當雜湊聚集表資料還沒有填滿時,如果執行全表掃描,可能會掃描很多空的空間。雜湊聚簇表適合透過雜湊鍵訪問且大小可以預先確定的表。

巢狀表:透過外來鍵將父表巢狀在子表中。Tom不推薦使用這種將巢狀表作為物理儲存機制,而是將其作為PL/SQL語言的一種擴充套件結構。對巢狀的查詢和修改比普通表要複雜得多,而且巢狀表還會帶來額外的儲存開銷。

臨時表:包括兩種型別,一種是基於事務的,另一種是基於會話的。臨時表中的資料會在事務或會話結束後自動清除。臨時表經常被用來生成中間結果集。臨時表的缺點是CBO無法收集臨時表的統計資訊。

物件表:物件表在Oracle中用來執行物件關係模型。和巢狀表類似的是,Tom不建議使用物件表,而是利用物件檢視進行替代。

=======================================================

在ORACLE中,表的型別有如下七種:

堆組織表,索引組織表,索引聚簇表,雜湊聚簇表,巢狀表,臨時表,物件表。下面得內容只是介紹在實際應用中經常使用的表型別,詳細的介紹可以看TOM的EXPERT ONE-ON-ONE第六章,而以下內容,幾乎99%都是源自該書,然後自己再總結整理出來的。


一、堆組織表:

儲存方式隨機無序的,尋找合適的地方空間進行儲存,我們現在使用的表,如果沒有特別指定,一般都是這種。

一個程式使用一個FREELISTS,當該FREELISTS用光後,不會到

另一個FREELISTS中找空間(即使你設定了多個FREELISTS),它

將直接提高表高水位標誌,也就是說,FREELISTS是管理高水位以下的塊,以上的塊只有FREELIST為0是才能使用。在9I以後的版本,如果採取了ASSM管理方式,FREELISTS引數是不能更改的。

pctused,控制塊進入FREELISTS,加上PCTFREE控制塊出FREELISTS;例如:PCTUSED 40,PCTFREE 10,意味著塊的使用率不能超過40%

塊用來更新需要保留的空間為10%,當一個塊要重新增加到FREELISTS,必須使用率是低於40%,當一個塊使用率達到60%時,它不

會從FREELISTS撤銷,只要在該塊使用達到90%的時候,會從FREELISTS中撤銷(因為該塊的PCTFREE為10%)。

二、索引組織表:

資料按主碼儲存和排序,同索引結構一樣,不過資料直接儲存於主碼後面。適用於資訊檢索、空間和OLAP程式。索引組織表的適用情況:
1、 程式碼查詢表。
2、 經常透過主碼訪問的表。
3、 構建自己的索引結構。
4、 加強資料的共同定位,要資料按特定順序物理儲存。
5、 經常用between…and…對主碼或唯一碼進行查詢。資料物理上分類查詢。如一張訂單表,按日期裝載資料,想查單個客戶不同時期的訂貨和統計情況。

索引組織表建立語法:

SQL> create table t2
2 (x int primary key,
3 y char(2000) default rpad('a',2000,'d'),
4 z date
5 )
6 organization index ——表示建立的表型別是IOT
7 nocompress ——同索引的壓縮選項一樣,表示是否對相同索引條目值進行壓縮儲存
8 pctthreshold 50 ——當行的大小超過塊大小的百分比時,超過列資料儲存至溢位段
9 including y ——IOT中每行including指定列前邊的列都儲存到索引塊中,其餘列儲存到溢位塊中
10 overflow ——IOT中行太大時允許設定另一溢位段來儲存溢位的資料,同行遷移相似
11 /
Table created.

索引組織表資料是有序的,當檢索資料的時候能降低邏輯讀和物理讀。沒有了PCTUSED引數,但是考慮到overflow段時,透過

pctthreshold和PCTFREE來考慮塊的使用


三、索引聚簇表:

儲存一組表的一種方法。某些相同的列放在同一個塊上。在把資料放入之前,必須需要建立“聚簇索引”。聚簇索引的工作時拿走
一個聚簇碼值,並且返回包含那個碼的塊的塊地址。當檢索資料的時候,ORACLE將讀聚簇碼,確定塊地址,然後讀資料。建立語法
如下:

SQL> create cluster test(id number)size 1024;
Cluster created.

---上面1024表示每個聚簇碼的大小,如果資料塊是8K,那麼一個資料塊將最大容納7個聚簇碼。每個聚簇儲存一種值。

SQL> create index idx_test_id on cluster test;
Index created.

SQL> create table test_10(id number,name varchar2(32)) cluster test(id);
Table created.

SQL> create table test_20(id number,age number(3)) cluster test(id);
Table created.

Cluster created.

SQL> create index idx_test_id on cluster test;
Index created.

SQL> create table test_10(id number,name varchar2(32)) cluster test(id);
Table created.

SQL> create table test_20(id number,age number(3)) cluster test(id);
Table created.

SQL>drop index idx_test_id;
Index dropped.

SQL> select * from test_10 t1,test_20 t2 where t1.id=t2.id and t1.id=1;
select * from test_10 t1,test_20 t2 where t1.id=t2.id and t1.id=1
*
ERROR at line 1:
ORA-02032: clustered tables cannot be used before the cluster index is built


四、雜湊聚簇表

和索引聚簇表類似,不同的是使用雜湊函式代替聚簇索引;

五、臨時表

臨時表用來儲存事務或會話期間的中間結果。臨時表的資料只有對當前會話是可見,即使在當前會話COMMIT資料以後也是不可見的

SQL> create global temporary table temp_table_transaction on commit delete rows as
2 select *from scott.emp where 1=0;

表已建立。


SQL> create global temporary table temp_table_session on commit preserve rows as

2 select *from scott.emp where 1=0;

表已建立。

SQL> insert into temp_table_session select *from scott.emp;

已建立14行。

SQL> insert into temp_table_transaction select *from scott.emp;

已建立14行。

SQL> select session_cnt,transaction_cnt from
2 (select count(*) session_cnt from temp_table_session),
3 (select count(*) transaction_cnt from temp_table_transaction);

14 14

SQL> commit;

提交完成。

SQL> select session_cnt,transaction_cnt from
2 (select count(*) session_cnt from temp_table_session),
3 (select count(*) transaction_cnt from temp_table_transaction);

14 0

當斷開會話,重新連線的時候會看到上面都是0,臨時表比正常表產生的REDO少得多,由於臨時表必須產生包含資料得UNDO資訊,所

以會產生一定數量得REDO日誌,UPDATE和DELETE產生最多得REDO日誌,INSERT和SELECT產生得REDO日誌最少;

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

相關文章