- 相關(guān)推薦
Oracle數(shù)據(jù)庫臨時表管理技巧
我們在創(chuàng)建數(shù)據(jù)表的時候,若沒有特殊的指明,那么我們創(chuàng)建的表是一個永久的關(guān)系型表格,也就是說,這個表格中對應的數(shù)據(jù),除非是我們顯示的刪除的話,表中的數(shù)據(jù)是永遠都存在的。相對應的,在Oracle數(shù)據(jù)庫中還有一種類型的表,叫做臨時表。這個臨時表跟永久表最大的區(qū)別就是表中的數(shù)據(jù)不會永遠的存在。當一個會話結(jié)束或者事務(wù)結(jié)束的時候,這個臨時表中的數(shù)據(jù),不用用戶自己刪除,數(shù)據(jù)庫自己會自動清除。
1、 事務(wù)臨時表的管理。
(1) 事務(wù)臨時表的創(chuàng)建。
Oracle數(shù)據(jù)庫根據(jù)臨時表的性質(zhì)不同,可以分為事務(wù)臨時表與會話臨時表。事務(wù)臨時表是指數(shù)據(jù)只有在當前事務(wù)內(nèi)有效。一般情況下,如果在創(chuàng)建數(shù)據(jù)表的時候,沒有特殊指明這表是會話臨時表的話,則該表默認為事務(wù)臨時表。
我們可以以下面的語句創(chuàng)建事務(wù)臨時表。
Create global temporary table Temp_user (ID NUMBER(12) Primary key,name varchar2(10)); |
筆者建議:
這個創(chuàng)建臨時表的語句中,雖然沒有顯性的指明該表是事務(wù)臨時表,但是,默認的情況下,若沒有指明是什么臨時表的話,系統(tǒng)默認是事務(wù)臨時表。我們要創(chuàng)建事務(wù)臨時表時,可以不指定關(guān)鍵字。但是,這查看起來比較麻煩。我建議,無論在建立什么臨時表,都要利用具體的關(guān)鍵字來顯形的指明,這大家看起來都方便。一般可以利用ON COMMIT DELETE ROWS關(guān)鍵字來說明該表就是事務(wù)性的臨時表,而不是會話性質(zhì)的臨時表。
(2) 事務(wù)臨時表數(shù)據(jù)的變化分析。
事務(wù)臨時表的話,當事務(wù)結(jié)束的時候,就會清空這個事務(wù)臨時表。所以,當我們在數(shù)據(jù)庫臨時表中插入數(shù)據(jù)后,只要事務(wù)沒有提交的話,該表中的數(shù)據(jù)就會存在。但是,當事務(wù)提交以后,該表中的數(shù)據(jù)就會被刪除。而且,這個變化不會在重做日志中顯示。
具體事務(wù)臨時表與會話臨時表有什么區(qū)別,我們在介紹完會話臨時表后會詳細介紹。
2、 會話臨時表的管理。
會話臨時表,顧名思義,是指數(shù)據(jù)只在當前會話內(nèi)有效的臨時表。關(guān)閉當前會話或者進行新的連接之后,數(shù)據(jù)表中的內(nèi)容就會被清除。那會話臨時表跟事務(wù)臨時表到底有什么區(qū)別呢?我們以一個實例來看其中的區(qū)別。
(1) 首先,創(chuàng)建一個會話臨時表。
CREATE GLOBAL TEMPOPARY TABLE TEMP_USER (ID NUMBER(12) Primary key,name varchar2(10)) ON COMMIT PRESERVE ROWS; |
也就是說,會話臨時表跟事務(wù)臨時表的創(chuàng)建語法大致相同,只有最后的關(guān)鍵字有區(qū)別。不過兩個表雖然類似,但是其內(nèi)部的處理機制還是有比較大的區(qū)別。
(2) 往該表中插入數(shù)據(jù)。
Insert into TEMP_USER values(1001,’victor’); |
往數(shù)據(jù)庫臨時表中插入數(shù)據(jù)的方法,跟往普通表中插入數(shù)據(jù)的方法是一樣的,都利用insert into語句進行操作。該臨時表的數(shù)據(jù)在會話結(jié)束之前都是存在這個表格中的。
(3) 提交該事務(wù)并查詢相關(guān)記錄。
我們利用COMMIT的語句把該事務(wù)提交以后,再用SELECT查詢語句進行查詢。我們知道,若該表是事務(wù)臨時表的話,則當該事務(wù)結(jié)束以后,該表中的內(nèi)容就會被刪除。但是,這是會話臨時表,所以即使該事務(wù)提交了,但是,利用SELECT語句進行查詢時,仍然可以查到該條員工記錄。
(4) 結(jié)束當前會話,并重新連接數(shù)據(jù)庫。
關(guān)閉當前會話,從新連接到數(shù)據(jù)庫后,再利用SELECT語句查詢時,會有什么結(jié)果呢?此時,就查不到我們剛才插入的數(shù)據(jù)。這也就是說,在關(guān)閉對話的時候,數(shù)據(jù)庫系統(tǒng)已經(jīng)把原有的數(shù)據(jù)刪除了。從以上的分析我們可以看中,會話臨時表與事務(wù)臨時表主要的差異就在于刪除數(shù)據(jù)時機的不同。事務(wù)性臨時表是在事務(wù)提交的時候清除數(shù)據(jù),而會話性臨時表則是在關(guān)閉當前會話的時候清除臨時表。只要當前會話沒有關(guān)閉,即使事務(wù)完成了,會話臨時表中的數(shù)據(jù)仍然存在,不會被清除。
3、 臨時表管理需要注意的地方。
臨時表相對與其他表來說,是一種比較特殊的表結(jié)構(gòu),但是,作用又比較大,Oracle數(shù)據(jù)庫若沒有這種表的話,還真是不行。為了管理好這種特殊的表,我們需要注意幾個細節(jié)。
一是要注意臨時表不能永久的保存數(shù)據(jù)。只所以稱為臨時表,就是因為該表中的內(nèi)容只是臨時存在的。當一個會話或者事務(wù)結(jié)束時,該表中的內(nèi)容就會被自動清空。所以,在臨時表中,一般不要保存永久數(shù)據(jù)。在實務(wù)中,有個不好的操作習慣,就是有些人在測試數(shù)據(jù)庫的時候,喜歡把測試的數(shù)據(jù)放在臨時數(shù)據(jù)表中。其實,這是對Oralce臨時數(shù)據(jù)表認識的錯誤。若我們在數(shù)據(jù)庫中,把要測試的數(shù)據(jù),如銷售定單的內(nèi)容放在數(shù)據(jù)庫的臨時表中的話,則在其他功能中,如要測試銷售定單日報表的功能時,就會找不到相關(guān)的定單內(nèi)容。因為離開特定的會話或者事務(wù)的話,臨時表中的內(nèi)容就會不存在了。所以,Oralce數(shù)據(jù)庫中所講的臨時表不是給我們來存儲測試數(shù)據(jù)的。
二是臨時表中的數(shù)據(jù)不會備份、恢復,對其的修改也不會有任何的日志信息。若我們在操作數(shù)據(jù)庫的時候,往數(shù)據(jù)庫的臨時表中存入了一些信息。此時突然服務(wù)器出現(xiàn)當機。此時,我們想通過數(shù)據(jù)庫備份文件恢復數(shù)據(jù)庫臨時表中的內(nèi)容,或者查看臨時表的日志信息,都是無法實現(xiàn)的。也就是說,當服務(wù)器以外死機重新啟動后,臨時表中的內(nèi)容就會被清空。在數(shù)據(jù)庫的任何地方,如數(shù)據(jù)庫備份文件或者日志信息中,都查不到在重新啟動之前數(shù)據(jù)庫臨時表中保存了哪些內(nèi)容,就好象根本沒有對臨時表進行操作一樣。
三是臨時表表空間的管理。臨時表在Oracle數(shù)據(jù)庫中,也是表的一種,其也有對應的表空間。在創(chuàng)建臨時表的時候,若我們不指定表空間的話,默認的表空間是SYSTEM。對于臨時表的表空間管理的話,我們需要注意一個小的細節(jié)。若我們把臨時表的表空間歸屬為SYSTEM的話,也就是說,在創(chuàng)建臨時表的時候不具體指定具體的表空間,則這個默認的表空間是不能被刪除的。而若我們在創(chuàng)建臨時表表空間的時候,指定為SYSTEM以外的表空間的話,則在不需要這表空間的時候,我們可以刪除。所以,為了后續(xù)管理的方便,筆者還是建議大家在創(chuàng)建臨時表的時候,要指定表空間。
四是要注意一個問題,臨時表只是數(shù)據(jù)是臨時的,而表仍然是永久的。也就是說,當一個會話結(jié)束或者一個事務(wù)完成時,其臨時表中的數(shù)據(jù)雖然刪除了,但是,臨時表本身仍然是存在的。也就是說。Oracle數(shù)據(jù)庫中的臨時表表是全局的,只是數(shù)據(jù)是臨時的。這跟SQL Server數(shù)據(jù)庫系統(tǒng)具有比較大的區(qū)別。其實,這兩個數(shù)據(jù)庫在臨時表的處理上有很大的不同,各有各的特色。在以后的文章中,我會專門敘述這兩種數(shù)據(jù)庫在臨時表管理機制上的不同,歡迎大家關(guān)注。
五是要注意Oracle數(shù)據(jù)庫在給臨時表填入數(shù)據(jù)的時候,不會對相應的記錄加鎖。也就是說,當在臨時表上執(zhí)行DML語句的操作時,不會給記錄加鎖,也不會將數(shù)據(jù)的變化內(nèi)容寫到重做(REDO)日志中。所以不能用臨時表保存永久的數(shù)據(jù),也不能對臨時表進行共同的操作。這是新手在管理數(shù)據(jù)庫臨時表經(jīng)常會碰到的問題。
六是臨時表與普通表之間不能相互轉(zhuǎn)換。在一般情況下,臨時表建立后,該表就不能被轉(zhuǎn)換成永久表。所以,這也說明一個道理,利用臨時表作為數(shù)據(jù)庫設(shè)計時候的測試表不合適。這個臨時表可能跟我們按字面意思理解的臨時表有誤,不是我們所認為的為了測試表結(jié)構(gòu)而建立的臨時表。這一點是我們在剛開始接觸ORACLE數(shù)據(jù)庫時,經(jīng)常會犯的錯誤。
【Oracle數(shù)據(jù)庫臨時表管理技巧】相關(guān)文章:
Oracle重做日志文件管理技巧03-10
Oracle數(shù)據(jù)庫SELECT語句03-27
Oracle認證考試技巧03-19
Oracle學習的技巧心得03-21