oracle之臨時表(temporary table)

1、臨時表的定義:

	用來保存事物或會話期間的中間結果,只對當前事務或者會話是可見的,其他任
何會話都無法進行讀取的臨時創建的表。

2、臨時表的特點

多用戶操作的獨立性:對於使用同一張臨時表的不同用戶,Oracle都會分配一個獨立
的TEMP SEGMENT,這樣就避免了多個用戶在對同一張臨時表操作時發生交叉,從而
保證了多個用戶操作的併發性和獨立性

3、臨時表的分類

1)會話級臨時表

會話級臨時表:會話級的臨時表因爲表中的數據與當前的會話還有關係,當你的ses
sion不退出的情況下,臨時表中的數據就還存在。當你的session退出後,臨時表中
的數據就消失了,每次會話退出後,臨時表中的數據就被刪除(truncate table)。
當以另一個session同時登陸的時候,是看不到上一個未關閉的session所保存的數據。
創建會話級臨時表:
Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) 
On Commit Preserve Rows; 
example:
create global temporary table student(
stu_id int(5)
,stu_name varchar(5)
,class_id int(5))
on commit preserve rows;
或者如果有需要建立的臨時表的時候:
CREATE GLOBAL TEMPORARY TABLE CGTT_PRESERVE_LHR ON COMMIT PRESERVE 
ROWS AS SELECT * FROM SCOTT.EMP WHERE 1=2;

2)事務級臨時表

事務級臨時表:事務級的的臨時表與事務有關,當事務提交或者事務回滾的時候,
臨時表中的數據會被截斷,其他的內容與會話級的臨時表一致(當退出session時
其對應的臨時表的內容也會被截斷)。
創建事務級臨時表:
Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2...) 
On Commit Delete Rows;
example:
create global temporary table student(
stu_id int(5)
,stu_name varchar(5)
,class_id int(5))
on commit delete rows;

4、兩種臨時表的區別

會話級臨時表採用的是:
on commit preserve rows,
事務級臨時表採用的是:
on commit delete rows;
會話級的臨時表在session結束的時候會臨時表中的數據纔會截斷;
事務級的臨時表在碰到commit,rollback,或者是會話結束,臨時表的數據都會被截
斷。

5、臨時表的使用場景

1)當一個sql關聯的表在2個及以上,並且和一寫小表關聯,可以將大表進行拆分並
且得到較小的結果集放在臨時表中
2)程序執行過程中可能存放的一寫臨時數據,這些數據在整個的會話過程中都需要
用等等。

6、臨時表的統計信息處理

臨時表是會話隔離的,收集臨時表的統計信息是沒有任何用處,還可能造成錯誤的執
行計劃。臨時表的統計信息要刪除,並且鎖定臨時表的統計信息,或者關閉數據庫的
自動收集統計信息任務,改成手動去收集。
begin
 dbms_stats.delete_table_stats('SCOTT', 'TMP_TRAN_DEPT');
end;
begin
 dbms_stats.lock_table_stats('SCOTT', 'TMP_TRAN_DEPT');
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章