資料庫表——EXPERT ONE-ON-ONE ORACLE
堆表:最常使用的普通表,資料的儲存沒有順序,當增加資料時會使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- EXPERT ONE-ON-ONE ORACLE總結Oracle
- Oracle專家高階程式設計 -- expert one-on-one oracleOracle程式設計
- Expert 101 Oracle——表Oracle
- SQLite Expert Professional資料庫開發管理SQLite資料庫
- Oracle資料庫表碎片整理Oracle資料庫
- oracle資料庫兩表資料比較Oracle資料庫
- 這兩天開始看Expert One-on-One J2EE Development without EJBdev
- ORACLE資料庫裡表匯入SQL Server資料庫Oracle資料庫SQLServer
- Oracle 資料庫整理表碎片Oracle資料庫
- Oracle資料庫開發——表(概念)Oracle資料庫
- Oracle資料庫快速Drop 大表Oracle資料庫
- oracle清除資料庫表空間Oracle資料庫
- 修改Oracle資料庫表的大小Oracle資料庫
- Oracle資料庫管理——表資料庫高水位及shrink操作Oracle資料庫
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- Oracle 資料庫字典 檢視 基表Oracle資料庫
- Oracle資料庫開發——臨時表Oracle資料庫
- Oracle批量建立、刪除資料庫表Oracle資料庫
- Agile PLM資料庫表結構(Oracle)資料庫Oracle
- 詳解ORACLE資料庫的分割槽表Oracle資料庫
- oracle為資料庫每張表建立序列Oracle資料庫
- 【招聘】HDS Senior Oracle ExpertOracle
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- Oracle資料庫開發——表(資料完整性約束)Oracle資料庫
- Oracle 巧用外部表將大量excel資料匯入資料庫OracleExcel資料庫
- Oracle資料庫表空間的資料檔案大小上限。Oracle資料庫
- ORACLE資料庫中刪除表資料後,資料庫表空間已使用不會自動減少Oracle資料庫
- Oracle資料庫開發——瞭解分割槽表Oracle資料庫
- 誤刪oracle資料庫表空間檔案Oracle資料庫
- 外部表在Oracle資料庫中使用心得Oracle資料庫
- Oracle資料庫設定預設表空間Oracle資料庫
- 臨時表在Oracle資料庫與SQL Server資料庫中的異同Oracle資料庫SQLServer
- Expert 101 Oracle——索引Oracle索引
- oracle expert one on one (chm ebook)Oracle
- One-on-One Oracle閱讀筆記2(轉)Oracle筆記
- Oracle資料庫-建庫、建表空間,建使用者Oracle資料庫
- Oracle案例11——Oracle表空間資料庫檔案收縮Oracle資料庫
- 建立資料庫表資料庫