暫存資料表和正式表有什麼區別?
暫存資料表有什麼作用?
建立暫存資料表有哪幾種方法?
暫存資料表一般儲存在暫存資料表空間
分兩種,事務級和會話級
一般用來儲存臨時需要的資料
事務級的暫存資料表在事務提交後自動刪除,會話級暫存資料表在會話結束後刪除
會話級
create global temporary table tablename(col1 coltype,..) on commit preserve rows;
事務級
..(與會話級相同).. on commit delete rows;
我們在建立資料表的時候,若沒有特殊的指明,那麼我們建立的表是一個永久的關係型表格,也就是說,這個表格中對應的資料,除非是我們顯示的刪除的話,表中的資料是永遠都存在的。相對應的,在Oracle資料庫中還有一種類型的表,叫做暫存資料表。這個暫存資料表跟永久表最大的區別就是表中的資料不會永遠的存在。當一個會話結束或者事務結束的時候,這個暫存資料表中的資料,不用使用者自己刪除,資料庫自己會自動清除。
1、 事務暫存資料表的管理。
(1) 事務暫存資料表的建立。
Oracle資料庫根據暫存資料表的性質不同,可以分為事務暫存資料表與會話暫存資料表。事務暫存資料表是指資料只有在當前事務內有效。一般情況下,如果在建立資料表的時候,沒有特殊指明這表是會話暫存資料表的話,則該表預設為事務暫存資料表。
我們可以以下面的語句建立事務暫存資料表。
Create global temporary table Temp_user
(ID NUMBER(12) Primary key,name varchar2(10));
筆者建議:
這個建立暫存資料表的語句中,雖然沒有顯性的指明該表是事務暫存資料表,但是,預設的情況下,若沒有指明是什麼暫存資料表的話,系統預設是事務暫存資料表。我們要建立事務暫存資料表時,可以不指定關鍵字。但是,這查看起來比較麻煩。我建議,無論在建立什麼暫存資料表,都要利用具體的關鍵字來顯形的指明,這大家看起來都方便。一般可以利用ON COMMIT DELETE ROWS關鍵字來說明該表就是事務性的暫存資料表,而不是會話性質的暫存資料表。
(2) 事務暫存資料表資料的變化分析。
事務暫存資料表的話,當事務結束的時候,就會清空這個事務暫存資料表。所以,當我們在資料庫暫存資料表中插入資料後,只要事務沒有提交的話,該表中的資料就會存在。但是,當事務提交以後,該表中的資料就會被刪除。而且,這個變化不會在重做日誌中顯示。
具體事務暫存資料表與會話暫存資料表有什麼區別,我們在介紹完會話暫存資料表後會詳細介紹。
2、 會話暫存資料表的管理。
會話暫存資料表,顧名思義,是指資料只在當前會話內有效暫存資料表。關閉當前會話或者進行新的串連之後,資料表中的內容就會被清除。那會話暫存資料表跟事務暫存資料表到底有什麼區別呢?我們以一個執行個體來看其中的區別。
(1) 首先,建立一個會話暫存資料表。
CREATE GLOBAL TEMPOPARY TABLE TEMP_USER
(ID NUMBER(12) Primary key,name varchar2(10))
ON COMMIT PRESERVE ROWS;
也就是說,會話暫存資料表跟事務暫存資料表的建立文法大致相同,只有最後的關鍵字有區別。不過兩個表雖然類似,但是其內部的處理機制還是有比較大的區別。
(2) 往該表中插入資料。
Insert into TEMP_USER values(1001,’victor’);
往資料庫暫存資料表中插入資料的方法,跟往普通表中插入資料的方法是一樣的,都利用insert into語句進行操作。該暫存資料表的資料在會話結束之前都是存在這個表格中的。
(3) 提交該事務並查詢相關記錄。
我們利用COMMIT的語句把該事務提交以後,再用SELECT查詢語句進行查詢。我們知道,若該表是事務暫存資料表的話,則當該事務結束以後,該表中的內容就會被刪除。但是,這是會話暫存資料表,所以即使該事務提交了,但是,利用SELECT語句進行查詢時,仍然可以查到該條員工記錄。
(4) 結束當前會話,並重新串連資料庫。
關閉當前會話,從新串連到資料庫後,再利用SELECT語句查詢時,會有什麼結果呢?此時,就查不到我們剛才插入的資料。這也就是說,在關閉對話的時候,資料庫系統已經把原有的資料刪除了。從以上的分析我們可以看中,會話暫存資料表與事務暫存資料表主要的差異就在於刪除資料時機的不同。事務性暫存資料表是在事務提交的時候清除資料,而會話性暫存資料表則是在關閉當前會話的時候清除暫存資料表。只要當前會話沒有關閉,即使事務完成了,會話暫存資料表中的資料仍然存在,不會被清除。
3、 暫存資料表管理需要注意的地方。
暫存資料表相對與其他表來說,是一種比較特殊的表結構,但是,作用又比較大,Oracle資料庫若沒有這種表的話,還真是不行。為了管理好這種特殊的表,我們需要注意幾個細節。
一是要注意暫存資料表不能永久的儲存資料。只所以稱為暫存資料表,就是因為該表中的內容只是臨時存在的。當一個會話或者事務結束時,該表中的內容就會被自動清空。所以,在暫存資料表中,一般不要儲存永久資料。在實務中,有個不好的操作習慣,就是有些人在測試資料庫的時候,喜歡把測試的資料放在臨時資料表中。其實,這是對Oralce臨時資料表認識的錯誤。若我們在資料庫中,把要測試的資料,如銷售定單的內容放在資料庫的暫存資料表中的話,則在其他功能中,如要測試銷售定單日報表的功能時,就會找不到相關的定單內容。因為離開特定的會話或者事務的話,暫存資料表中的內容就會不存在了。所以,Oralce資料庫中所講的暫存資料表不是給我們來儲存測試資料的。
二是暫存資料表中的資料不會備份、恢複,對其的修改也不會有任何的日誌資訊。若我們在操作資料庫的時候,往資料庫的暫存資料表中存入了一些資訊。此時突然伺服器出現當機。此時,我們想通過Database Backup檔案恢複資料庫暫存資料表中的內容,或者查看暫存資料表的日誌資訊,都是無法實現的。也就是說,當伺服器以外死機重新啟動後,暫存資料表中的內容就會被清空。在資料庫的任何地方,如Database Backup檔案或者日誌資訊中,都查不到在重新啟動之前資料庫暫存資料表中儲存了哪些內容,就好象根本沒有對暫存資料表進行操作一樣。
三是暫存資料表資料表空間的管理。暫存資料表在Oracle資料庫中,也是表的一種,其也有對應的資料表空間。在建立暫存資料表的時候,若我們不指定資料表空間的話,預設的資料表空間是SYSTEM。對於暫存資料表的資料表空間管理的話,我們需要注意一個小的細節。若我們把暫存資料表的資料表空間歸屬為SYSTEM的話,也就是說,在建立暫存資料表的時候不具體指定具體的資料表空間,則這個預設的資料表空間是不能被刪除的。而若我們在建立暫存資料表資料表空間的時候,指定為SYSTEM以外的資料表空間的話,則在不需要這資料表空間的時候,我們可以刪除。所以,為了後續管理的方便,筆者還是建議大家在建立暫存資料表的時候,要指定資料表空間。
四是要注意一個問題,暫存資料表只是資料是臨時的,而表仍然是永久的。也就是說,當一個會話結束或者一個事務完成時,其暫存資料表中的資料雖然刪除了,但是,暫存資料表本身仍然是存在的。也就是說。Oracle資料庫中的暫存資料表表是全域的,只是資料是臨時的。這跟SQL Server資料庫系統具有比較大的區別。其實,這兩個資料庫在暫存資料表的處理上有很大的不同,各有各的特色。在以後的文章中,我會專門敘述這兩種資料庫在暫存資料表管理機制上的不同,歡迎大家關注。
五是要注意Oracle資料庫在給暫存資料表填入資料的時候,不會對相應的記錄加鎖。也就是說,當在暫存資料表上執行DML語句的操作時,不會給記錄加鎖,也不會將資料的變化內容寫到重做(REDO)日誌中。所以不能用暫存資料表儲存永久的資料,也不能對暫存資料表進行共同的操作。這是新手在管理資料庫暫存資料表經常會碰到的問題。
六是暫存資料表與普通表之間不能相互轉換。在一般情況下,暫存資料表建立後,該表就不能被轉換成永久表。所以,這也說明一個道理,利用暫存資料表作為資料庫設計時候的測試表不合適。這個暫存資料表可能跟我們按字面意思理解的暫存資料表有誤,不是我們所認為的為了測試表結構而建立的暫存資料表。這一點是我們在剛開始接觸ORACLE資料庫時,經常會犯的錯誤。