臨時表空間和臨時段的研究
對于臨時表空間,主要用來做一些排序類的操作,oracle對于臨時表空間采用的使用策略和其他的永久表空間的不同,當第一個使用臨時表空間的排序操作開始,臨時段被創建
相應視圖:
SQL> select table_name from dict where table_name like 'V$TEMP%';
TABLE_NAME
------------------------------
V$TEMPFILE
V$TEMPORARY_LOBS
V$TEMPSEG_USAGE
V$TEMPSTAT
V$TEMP_CACHE_TRANSFER
V$TEMP_EXTENT_MAP
V$TEMP_EXTENT_POOL
V$TEMP_HISTOGRAM
V$TEMP_PING
V$TEMP_SPACE_HEADER
SQL> SELECT TABLE_NAME FROM DICT WHERE TABLE_NAME LIKE 'V$SORT%';
TABLE_NAME
------------------------------
V$SORT_SEGMENT
V$SORT_USAGE
1、v$sysstat(查看數據庫排序信息)
SQL> select name,value from v$sysstat where name like 'sort%';
NAME VALUE
---------------------------------------------------------------- ----------
sorts (memory) 3272
sorts (disk) 0
sorts (rows) 16442
2、v$sort_usage=v$tempseg_usage(查看臨時表空間使用情況)
SQL> select username,session_num from v$tempseg_usage;
USERNAME SESSION_NUM
------------------------------ -----------
SYS 8
SYS 8
SYS 8
3、v$sort_segment(臨時段中的extent管理)
SQL> select TOTAL_EXTENTS,USED_EXTENTS,FREE_EXTENTS,ADDED_EXTENTS from v$sort_segment where tablespace_name='TEMP';
TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS
------------- ------------ ------------ -------------
902 0 902 898
v$temp_space_header(該視圖用來查詢臨時表空間使用情況)
SQL> select tablespace_name,BYTES_USED,BYTES_FREE from v$temp_space_header;
TABLESPACE_NAME BYTES_USED BYTES_FREE
------------------------------ ---------- ----------
TEMP 946864128 0
extent會被分配到這個臨時段中,但當排序操作完成后,這個臨時段并不會被刪除掉,只會被oracle標記為Free從而使其他排序操作可以繼續使用這個臨時段,從這里我們也可以明白,對于一個臨時表空間只能存在一個臨時段。對于段中的extent管理通過v$sort_segment:
SQL> select TOTAL_EXTENTS,USED_EXTENTS,FREE_EXTENTS,ADDED_EXTENTS from v$sort_segment where tablespace_name='TEMP';
TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS
------------- ------------ ------------ -------------
117 117 0 6571
當我們數據庫中temp表空間不在被會話所使用,相應的臨時段就會釋放。extent被標記為Free
TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS
------------- ------------ ------------ -------------
364 0 364 6818
從上面可知,一但開始使用臨時段,oracle就會分配對應的extent,不斷往段中添加extent,而一但排序操作完成,oracle會立即釋放使用的段,從而使段中的extent標記為Free.
oracle的這一特性也使得oracle的臨時表空間的數據文件將會越來越大,所以對于臨時表空間我們也必須定期的觀察并做維護。
模擬臨時表空間被大量消耗:(模擬一個排序操作)
select * from dba_tab_columns a,dba_tab_columns b order by a.owner,b.table_name;
運行一段時間后掐掉,此時發現對應oracle目錄變大,臨時表空間也變大。
SQL> !df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 8254240 2244484 5590464 29% /
none 403460 0 403460 0% /dev/shm
/dev/sda2 10317860 6550784 3242956 67% /oracle
SQL> select username,session_num from v$sort_usage where tablespace='TEMP';
USERNAME SESSION_NUM
------------------------------ -----------
SYS 8
此時我們查找對應臨時數據文件使用情況:
SQL> select max(SEGBLK#) from v$sort_usage;
MAX(SEGBLK#)
------------
9
SQL> select 8*8192/1024/1024/1024 from dual;
8*8192/1024/1024/1024
---------------------
.000061035
我們可以看到,雖然臨時表空間很大,但是臨時表空間的使用卻不大,我們采用resize的方法縮小數據文件:
SQL> alter database tempfile '/oracle/app/oradata/orcl/temp01.dbf' resize 100m;
Database altered.
SQL> !ls -l /oracle/app/oradata/orcl/temp01.dbf
-rw-r----- 1 oracle dba 104865792
數據文件已經縮小到100m
減小臨時表空間,釋放磁盤空間的另一個方法是臨時表空間的替換:
創建temp:
SQL> create temporary tablespace temp2
2 tempfile 'E:\XXXXXX\XXXXX\XXXX.dbf' size 100m autoextend on;
確認原temp是否空閑:
SQL> SELECT USERNAME,USER FROM V$SORT_USAGE WHERE TABLESPACE='TEMP'
SQL> alter database default temporary tablespace TEMP2
SQL> drop tablespace TEMP including contents and datafiles
查看是否正確刪除temp表空間。
查看空間是否釋放。