Oracle的臨時表

dba_manganese發表於2014-03-26
Oracle允許建立臨時表來儲存會話或事務中的資料,在會話或事務結束時,表中的資料行被刪除。在處理複雜查詢或事務時,由於在資料寫入永久表之前需要暫時儲存行資訊,所以就產生了用來儲存這些資料的臨時表。臨時表提高了包含複雜查詢的事務的效能。對複雜查詢的傳統響應方式之一是使用一個檢視使複雜查詢更易於操作,但是,該檢視在每次訪問它時都需要執行,因而在許多情況下抵消了它的好處。臨時表是一個優秀的解決方案,因為它是為用於特殊會話或事務的複雜的select語句而建立的,並且它在會話後自動清除資料。

臨時表的定義對於所有會話來說都是可見的,然而,臨時表中的資料僅對執行插入這些資料的操作的會話是可見的。臨時表通過"create global temporary table" 語句建立,on commit子句說明了臨時表中的資料的儲存時限,說明如下:
1、ON COMMIT DELETE ROWS -- 基於具體事務的臨時表
當某事務第一次插入資料到該臨時表時,會話將繫結該臨時表,這種繫結一直持續到事務的結束。當事務提交會回滾後,oracle將截斷該表。例如:

SQL> create global temporary table tmp1 (x number) on commit delete rows;
Table created.

SQL> insert into tmp1 values (123);
1 row created.

SQL> select * from tmp1;
         X
----------
       123

SQL> commit;
Commit complete.

SQL> select * from tmp1;
no rows selected

2、ON COMMIT PRESERVE ROWS -- 基於特定會話的臨時表
當某會話第一次插入資料到該臨時表時,該會話將繫結該臨時表,這種繫結一直持續到會話結束或該會話truncate該臨時表。當會話終止時,oracle將截斷該表。

臨時表的其他特性如下:
A、臨時表上可以建立索引,這些索引也是臨時的。預設情況下,臨時表中的行被儲存在資料庫的預設臨時表空間內。也可以通過"create global temporary table ... tablespace"語句,為該臨時表指定另外的臨時表空間。
B、與永久表不同,臨時表和其索引在建立時不會為其分配段,只有在第一次為該表插入資料(或者create table ... as select)時,才會執行段分配的操作。 //這一點在實驗的過程中有一些疑問
C、一個基於特定事務的臨時表在某一時刻只允許執行一個事務,如果事務中包含多個自治事務,那麼只有在一個自治事務提交完成後,下一個自治事務才能夠使用該臨時表。
D、在備份和恢復過程中,臨時表中的資料是不可用的。

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

相關文章