Oracle臨時表
?
??? Oracle臨時表只需要創建一次,其結構總是有效的,每次使用后被清空的只是表里的數據。
?
??? Oracle的臨時表還保證了
多用戶操作的獨立性:對于使用同一張臨時表的不同用戶,ORACLE都會分配一個獨立的Temp Segment,這樣就避免了多個用戶在對同一張臨時表操作時發生交叉,從而保證了多個用戶操作的并發性和獨立性;
??? Oracle臨時表分為兩種,如下:
?
??? create
global
temporary
table
t66 (
???
?
ID
number
,
???
?
NAME
varchar2
(
20
),
??? ? OP_DATE
date
)
??? on
commit
delete
rows
;--數據提交時清空表
?
??? create
global
temporary
table
t66 (
???
?
ID
number
,
???
?
NAME
varchar2
(
20
),
??? ? OP_DATE
date
)
??? on
commit
preserve
rows
;--會話結束時清空表
?
?
臨時表的存儲空間
?
???
select
owner,table_name,tablespace_name
from
dba_tables
where
table_name=
'T66';
?
??? 由上面的查詢發現,創建的臨時表T66不在默認的表空間中儲存
?
??? SQL> alter tablespace temp offline;?????
?
??? 表空間已更改。
?
??? SQL> insert into t66
?????? 2 select * from t1;
?
??? insert into t66
??????????????? *
?
??? ERROR 位于第 1 行:
??? ORA-01542: 表空間'TEMP'脫機,無法在其中分配空間
?
??? 由上面的操作發現,表T66存儲于TEMP表空間中
?
?
臨時表應用舉例
?
??? 1、臨時表不建立索引,所以如果數據量比較大或進行多次查詢時,不推薦使用
?
??? 2、數據處理比較復雜的時候使用臨時表快,反之視圖快點
?
??? 3、在僅僅查詢數據的時候建議用游標
?
??? 4、在分析數據時,經常用到臨時表來存放中間數據
?
??? 舉例:
對于一個電子商務類網站,不同消費者在網站上購物,就是一個獨立的SESSION,選購商品放進購物車中,最后將購物車中的商品進行結算。也就是說,必須在整個SESSION期間保存購物車中的信息。同時,還存在有些消費者,往往最終結賬時放棄購買商品。如果,直接將消費者選購信息存放在最終表(PERMANENT)中,必然對最終表造成非常大的壓力。
??? 因此,對于這種案例就可以采用創建臨時表 (ON COMMIT PRESERVE ROWS) 的方法來解決。數據只在 SESSION 期間有效,對于結算成功的有效數據,轉移到最終表中后,ORACLE自動TRUNCATE 臨時數據;對于放棄結算的數據,ORACLE 同樣自動進行 TRUNCATE ,而無須編碼控制,并且最終表只處理有效訂單,減輕了頻繁的DML的壓力。
?
?
臨時表使用索引問題
?
??? 總體來說,在臨時表上建立索引經常會被忽略不使用,所以盡量還是不要加索引,太大的數據量就不要用臨時表了。
?
?
?
?