Oracle 暫存資料表空間是Oracle資料庫的重要組成部分,儘管該部分並沒有cont體繫結構上得以展現,但其重要地位也是不容忽視的。尤其是對於大型的頻繁操作,如建立索引,排序等等都需要在暫存資料表空間完成來減少記憶體的開銷。當然對於查詢效能要求較高的應儘可能的避免在磁碟上完成這些操作。本文主要描述的是暫存資料表空間的管理與受損恢複。
一、暫存資料表空間的特性與注意事項
1.特性
使用者儲存臨時資料的資料表空間
臨時資料通常只在一個資料庫會話期間記憶體在的資料,分為兩種形式,排序資料和全域暫存資料表
臨時資料不會被寫入儲存永久對象的普通資料表空間內,而是儲存在暫存資料表空間的臨時段中
暫存資料表空間臨時性導致不需要備份該類型的資料表空間,RMAN也不支援對暫存資料表空間的備份
對於臨時資料的處理,不會產生重做,也不會產生撤銷資料
暫存資料表空間的資料檔案不能置為唯讀、不能重新命名
監時資料表空間的資料檔案的日誌方式總是NOLOGGING
使用暫存資料表空間的主要操作
CREATE INDEX,ALTER INDEX ...REBUILD,ORDER BY,GROUP BY,DISTINCT,UNION,INTERSECT,MINUS,SORT-MERGER,JOIN,ANALYZE
2.暫存資料表空間使用的注意事項
a. 每個使用者都有一個預設的暫存資料表空間,對於暫存資料表空間使用較高的系統,建議將暫存資料表空間資料檔案分布到不同的磁碟
b. 對於大型操作頻繁,(大型查詢,大型分類查詢,大型統計分析等),應指定單獨的暫存資料表空間,以方便管理
c. 分配使用者單獨暫存資料表空間,一般是針對大型產品資料庫,OLTP資料庫,資料庫倉庫
d. 對於小型產品不需要單獨制定暫存資料表空間,使用預設暫存資料表空間
e. 對於暫存資料表空間建議關閉自動擴充功能,避免過度擴充所致的空間壓力
關於暫存資料表空間的建立與管理請參考:Oracle 資料表空間與資料檔案
二、暫存資料表空間的管理
1. 查看預設的暫存資料表空間
SQL> select property_name,property_value from database_properties
2 where property_name like 'DEFAULT%';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
DEFAULT_TBS_TYPE SMALLFILE
2.查看暫存資料表空間的大小及位置
SQL> select s.name tbsname,t.name,(t.bytes/1024/1024) bytes,status
2 from v$tablespace s,v$tempfile t
3 where s.ts# = t.ts#;
TBSNAME NAME BYTES STATUS
---------- --------------------------------------------- ---------- -------
TEMP /u01/app/oracle/oradata/orcl/temp01.dbf 30 ONLINE
SQL> select tablespace_name,file_name,bytes/1024/1024 Size_MB from dba_temp_files;
TABLESPACE FILE_NAME SIZE_MB
---------- --------------------------------------------- ----------
TEMP /u01/app/oracle/oradata/orcl/temp01.dbf 30
SQL> select tablespace_name,logging,allocation_type
2 from dba_tablespaces where tablespace_name='TEMP';
TABLESPACE LOGGING ALLOCATIO
---------- --------- ---------
TEMP NOLOGGING UNIFORM
3. 暫存資料表檔案大小和已使用空間
SELECT t1."Tablespace" "Tablespace",
t1."Total (G)" "Total (G)",
nvl(t2."Used (G)", 0) "Used(G)",
t1."Total (G)" - nvl(t2."Used (G)", 0) "Free (G)"
FROM (SELECT tablespace_name "Tablespace",
to_char((SUM(bytes / 1024 / 1024 / 1024)), '99,999,990.900') "Total (G)"
FROM dba_temp_files
GROUP BY tablespace_name
UNION
SELECT tablespace_name "Tablespace",
to_char((SUM(bytes / 1024 / 1024 / 1024)), '99,999,990.900') "Total (G)"
FROM dba_data_files
WHERE tablespace_name LIKE 'TEMP%'
GROUP BY tablespace_name) t1,
(SELECT tablespace, round(SUM(blocks) * 8 / 1024 /1024) "Used (G)"
FROM v$sort_usage
GROUP BY tablespace) t2
WHERE t1."Tablespace" = t2.tablespace(+);
Tablespace Total (G) Used(G) Free (G)
------------------------------ --------------- ---------- ----------
GOEX_TEMP 31.999 1 30.999
FIX_TEMP 0.098 0 .098
TEMP 0.195 0 .195