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

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

1、建立臨時表大數據

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

  • 會話期臨時表

CREATE GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;xml

  • 事務期臨時表

CREATE GLOBAL TEMPORARY TABLE ON COMMIT DELETE ROWS;索引

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

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

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

用戶可使用 CREATE INDEX 語句爲臨時表(temporary table)建立索引。建立在臨時表上的索引也是臨時的,索引數據的生存週期與臨時表內數據的生存週期相同。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 將解除會話與此臨時表的綁定。

3、咱們在何時應該選擇臨時表

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

臨時表自己並不難使用,可是咱們時常會在生產中忘記它的存在。就我我的經驗來講,在某些特定的需求中,使用臨時表確實可以下降查詢的複雜度和提升查詢速度。

相關文章
相關標籤/搜索