1. 程式人生 > >Oracle學習筆記(二)——臨時表

Oracle學習筆記(二)——臨時表

create 永久 以及 alter 會話 數量 ger pan 復雜

在針對大數據量的多表級聯查詢或復雜事務處理的時候,引入Oracle臨時表是一種不錯的策略。因此,在解決實際需求時經常會遇到需要使用存儲過程和臨時表相互配合的情況。下面就Oracle如何創建臨時表以及註意事項做出總結:

一、創建臨時表

Oracle臨時表分為回話期和事務期兩種類型,他們的創建語法基本一致:

  • 會話期臨時表

CREATE GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;

  • 事務期臨時表

CREATE GLOBAL TEMPORARY TABLE ON COMMIT DELETE ROWS;

二、會話期臨時表與事務期臨時表的區別

在與事務相關的臨時表中,數據只存在於事務期間。而在與會話相關的臨時表中,數據只存在於會話期間。臨時表中的數據為一個會話所私有。每個會話只能查詢與修改屬於此會話的數據。對臨時表數據進行 DML 操作時無需加鎖(Lock)。LOCK 語句對臨時表無效,因為每個會話只能操作其私有數據。

針對與會話相關的臨時表(session-specific temporary table)執行的 TRUNCATE 語句只會清除(truncate)屬於此會話的數據,而不會清除此臨時表中屬於其他會話的數據。

用戶可以使用 CREATE INDEX 語句為臨時表(temporary table)創建索引。創建在臨時表上的索引也是臨時的,索引數據的生存周期與臨時表內數據的生存周期相同。

*用戶可以創建同時訪問永久表(permanent table)與臨時表(temporary table)的視圖。用戶還可以在臨時表上創建觸發器(trigger)。

臨時表(temporary table)使用臨時段(temporary segment)存儲數據。與永久表(permanent table)不同,Oracle 在創建臨時表及臨時索引時並不會為其分配段(segment),段是在第一次執行 INSERT(或CREATE TABLE AS SELECT)語句時進行分配。在發生首次 INSERT 之前執行的 SELECT,UPDATE,或 DELETE 語句操作的是一個空表。

當沒有會話(session)與臨時表(temporary table)綁定(bound)的時候,用戶才能夠對其執行 DDL 操作(ALTER TABLE,DROP TABLE,CREATE INDEX 等)。對臨時表執行 INSERT 語句時,會話將和此臨時表綁定。在會話結束時對臨時表執行的 TRUNCATE 語句將解除(unbound)會話與此臨時表的綁定。對於與事務相關的(transaction-specific)臨時表,執行 COMMIT 或 ROLLBACK 將解除會話與此臨時表的綁定。

三、我們在什麽時候應該選擇臨時表

臨時表最常見的使用場合是在存儲過程中。例如保存一些復雜檢索的結果以提供給之後使用,從而可以避免反復查詢。另一種可能的使用場合是在進行某些大數量的多表查詢時,一些查詢的結果集數據量較少。我們可以先將這部分數據保存在臨時表中,從而降低多表查詢的級聯數量提高檢索速度。這時更適合選擇會話級臨時表。

臨時表本身並不難使用,但是我們時常會在生產中忘記它的存在。就我個人經驗來說,在某些特定的需求中,使用臨時表確實能夠降低查詢的復雜度和提高查詢速度。

Oracle學習筆記(二)——臨時表