oracle臨時表實際應用

jinqibingl發表於2015-02-13

(這段是後面新增的:臨時表,在實際應用中,其實和nologging的固定表,是差不多的,都是中間表,所以這裡為什麼新增這段話,是讓自己記得,如果不建立臨時表,而是使用固定表,來作為中間表的話,要記得將這個表改為nologging,否則會產生很多日誌出來,沒有必要,將固定表改為nologging,很簡單:alter table xxx nologging就可以了,這個我已經用dba_tables查過了,確實起作用)。
oracle的臨時表,global temporary table。
注意的是:這個臨時表,不儲存資料,其資料變化也不記入日誌。
所以一般是在程式中,臨時儲存資料用的,也就是儲存在操作過程中臨時用到的資料,包括一些統計中間資料,或者臨時生成的字典等等。
由於其資料變化不計入日誌,所以在統計程式或者臨時的字典的使用,可以很好的避免產生不必要的日誌。
比fixed table好很多,因為固定表要產生日誌,帶來很多不必要的儲存負載。
推薦程式中用到的臨時資料,儘量儲存到臨時表中,因為1、臨時表隔離度更高,只有使用者自己可見;2、使用者用過,oracle系統會自動刪除資料,不需要增加額外的程式碼。
經過實際操作發現,臨時表和固定表的操作方式,是一樣的,許可權方面也是差不多的,只不過一個是臨時用的,用過就沒有資料了,而且不產生日誌,固定表是永久儲存資料,產生日誌,也可以建立索引、觸發器等,也可以建立同義詞。也就是說相差不遠。
臨時表,分為兩種,一種是基於會話的,一種是基於事務,兩者之間有區別,會話指的程式尚在登入期間,程式和資料庫之間的會話存在,基於事務的,指的是事務期間。
基於會話的臨時表,在建立的時候,指定on commit preserve rows,就是基於會話的臨時表,這裡面的資料,在程式和資料庫之間的會話存在期間,資料一直儲存,不刪除,從這方面考慮,可以認定這個方式可以用於生成程式使用的臨時字典之類的。
基於事務的臨時表,在建立的時候,指定on commit delete rows,就是基於事務的臨時表,這種表,要對事務有所瞭解才能使用,事務指的是產生的一個insert、update、delete之類的動作,不是select,事務的完成和關閉,以當前使用者的commit動作為結束,當使用者程式發出commit命令,oracle就會刪除臨時表中的資料。這個特性,非常適合用於查詢程式過程中,產生的統計中間資料,當統計程式過於複雜,程式無法一次性完成統計動作,或者為了減輕資料庫和程式之間的資料來往負擔,可以將統計出來的資料臨時存放在臨時表中,然後將結果查詢到程式介面,在完成將結果抓取到程式介面上後,再發出commit命令,就可以清空臨時表。
在我實際編寫的統計程式中,因為臨時表選擇的問題,統計結果翻倍,所以我認為,查詢統計程式,最好使用基於事務的臨時表,在將統計結果抓取到程式介面上後,發出commit命令,就可以完成當前事務,從而刪除臨時表中的資料。這也就是為了避免一個操作上的失誤,導致的統計錯誤,就是多點幾下按鈕,在基於會話的臨時表,或者在程式中沒有發出commit命令結束事務,多點幾下按鈕,會導致臨時表中的資料,多次插入,那樣當然統計結果也就錯了。
最後記錄下,後臺操作語句:
create global temporary table xxxx(xxx varchar2(10),xxxxx varchar2(20));
grant all on xxxx to role_xxx;
至於選擇表的問題,可以建立同義詞,也就是使用system.xxxx ,這兩種方式。

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

相關文章