每一個Oracle版本,都會有很多新特性和技術推出。這些技術特性,在很大程度上都能改進Oracle運行效率和應用效果,或者提高我們日常工作能力。
Temp資料表空間是Oracle資料表空間體系中一種很特殊的資料表空間對象。暫存資料表空間主要用於支援暫存資料表空間使用、排序分組動作空間溢出暫存等作用。我們對Temp的使用,大都是局限在空間分配和大小設定上。在11g有,有一系列針對Temp資料表空間的新特性,可以很大程度上協助我們工作。
視圖dba_temp_free_space是11g引入的一個新視圖,用於描述暫存資料表空間使用方式。
--------------------------------------分割線 --------------------------------------
Oracle Undo 鏡像資料探究
Oracle 復原(ROLLBACK)和撤銷(Undo)
Undo 資料表空間損壞導致無法open
Undo資料表空間失敗的處理方法
Oracle Undo資料表空間重建與恢複
--------------------------------------分割線 --------------------------------------
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 479199232
最近和一個朋友聊起其中allocated_space和free_space的含義,覺得很有意思。筆者決定通過一些實驗來證明結論。
1、環境準備
筆者使用Oracle11gR2環境進行測試。
SQL> select * from v$version;
BANNER
------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
當前僅包括預設的Temp暫存資料表空間。
SQL> select file_name, file_id, tablespace_name from dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME
------------------------------ ---------- ------------------------------
/u01/app/oradata/ORA11G/datafi 1 TEMP
le/o1_mf_temp_92t73qm8_.tmp
說明:為減少系統對實驗結果影響,筆者建立全新的暫存資料表空間,通過一系列的典型操作來,監控欄位變化形態來證明實驗結論。
2、資料表空間建立過程
首先我們建立暫存資料表空間temptest。之前,我們檢查磁碟空間空閑情況:
[oracle@SimpleLinux ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 24G 22G 52% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
當前/目錄對應大小48G,使用24G,有22G可用空間。下面建立資料表空間:
SQL> create temporary tablespace temptest tempfile size 5G
2 extent management local uniform size 1m;
Tablespace created
和建立同樣大小資料資料表空間相比起來,執行建立暫存資料表空間語句速度很快。之後查看磁碟空間情況。
[oracle@SimpleLinux ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 24G 22G 52% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
容量上沒有任何變化,如果Oracle建立了5G空間,至少會顯示在磁碟大小上。但是,從Oracle內部註冊體系和檔案系統中,我們都是可以看到臨時檔案的產生。
SQL> select file_name, file_id, tablespace_name from dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME
------------------------------ ---------- ---------------
/u01/app/oradata/ORA11G/datafi 1 TEMP
le/o1_mf_temp_92t73qm8_.tmp
/u01/app/oradata/ORA11G/datafi 2 TEMPTEST
le/o1_mf_temptest_9j80859z_.tm
p
[oracle@SimpleLinux datafile]$ ls -l | grep temptest
-rw-r----- 1 oracle oinstall 5368717312 Feb 19 08:55 o1_mf_temptest_9j80859z_.tmp
這個是Oracle臨時資料檔案的特性,Oracle臨時檔案和資料檔案不同,建立之後是不直接佔滿空間的。我們都有這樣的經曆,建立一個很大的資料資料表空間,create/add過程依據不同的系統IO情況,是很消耗時間的。但是臨時檔案不是,一個上十幾G的臨時檔案可以在很快的建立成功。
但是,這個過程其實是“障眼法”。Oracle雖然建立了臨時檔案,檔案系統中也分配顯示大小檔案,但是空間卻沒有真正的分配。這在一些文獻中稱為“疏鬆檔案”,檔案架構範圍都在,但是沒有實際寫入過程。TempFile中的allocated,也就與疏鬆檔案有關。
注意:這就告訴我們系統部署人員,要注意臨時檔案的這個特性,不要以為磁碟上有很多的空間。
此時,我們觀察視圖dba_temp_free_space,結果如下:
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 1048576 5367660544
Tablespace_size為5368709120bytes大小,摺合5G。這就是我們對暫存資料表空間Temptest的定義值。
Allocated_space為1048576bytes,摺合1M。我們建立了臨時檔案,即使是稀疏結構,在檔案系統上也會有一些中繼資料資訊佔據空間。此時的allocated_space=1M也是合理的。
Free_Space為5367660544bytes,摺合5119M。如果加入1M(allocated_size),就是5120M,摺合5G,與Tablespace_size對應。
目前資料庫沒有使用temptest進行操作,所以對新的臨時檔案而言,我們可以得到如下結論:
ü 新建立的資料檔案是以“疏鬆檔案”的方式,雖然建立成功,但是在檔案系統中不是寫入完全,空間佔據是沒有分配的狀態;
ü 新建立檔案情況下:Allocated_space最開始表示中繼資料資訊;
ü 新建立檔案情況下:Free_Space表示沒有分配的空間;
下面我們使用暫存資料表進行空間使用。
更多詳情見請繼續閱讀下一頁的精彩內容: