臨時(shí)表空間是Oracle體系結(jié)構(gòu)中比較特殊的結(jié)構(gòu)。通常情境下,數(shù)據(jù)庫(kù)使用者只需要設(shè)置對(duì)應(yīng)的臨時(shí)表空間(到用戶(hù)),臨時(shí)段分配等工
臨時(shí)表空間是Oracle體系結(jié)構(gòu)中比較特殊的結(jié)構(gòu)。通常情境下,數(shù)據(jù)庫(kù)使用者只需要設(shè)置對(duì)應(yīng)的臨時(shí)表空間(到用戶(hù)),臨時(shí)段分配等工作都是系統(tǒng)自動(dòng)完成。當(dāng)臨時(shí)數(shù)據(jù)不需要時(shí),Oracle后臺(tái)進(jìn)程SMON也會(huì)負(fù)責(zé)將臨時(shí)段回收。
在Oracle的備份恢復(fù)體系中,臨時(shí)文件的地位比較低。在進(jìn)行備份動(dòng)作時(shí),RMAN都不會(huì)進(jìn)行臨時(shí)文件恢復(fù)。在恢復(fù)啟動(dòng)過(guò)程中,如果發(fā)現(xiàn)臨時(shí)文件不存在,通常Oracle也會(huì)自動(dòng)將臨時(shí)文件創(chuàng)建出來(lái)。
--------------------------------------分割線(xiàn) --------------------------------------
Oracle 表空間管理和優(yōu)化
使用RMAN進(jìn)行表空間TSPITR自動(dòng)恢復(fù)
ORA-3233表空間相關(guān)問(wèn)題處理
Oracle查看數(shù)據(jù)庫(kù)表空間使用情況sql語(yǔ)句
Oracle 表空間使用率監(jiān)控
--------------------------------------分割線(xiàn) --------------------------------------
1、Temp漫談
Oracle臨時(shí)表空間主要充當(dāng)兩個(gè)主要作用:臨時(shí)表數(shù)據(jù)段分配和排序匯總溢出段。我們創(chuàng)建的臨時(shí)表,在使用過(guò)程中,會(huì)有大量的數(shù)據(jù)段結(jié)構(gòu)的分配。這個(gè)分配就是利用臨時(shí)表空間。
排序匯總溢出的范圍比較廣泛。我們?cè)赟QL語(yǔ)句中進(jìn)行order by/group by等操作,首先是選擇PGA的內(nèi)存sort area、hash area和bitmap area。如果SQL使用排序空間很高,單個(gè)server process對(duì)應(yīng)的PGA不足以支撐排序要求的時(shí)候,臨時(shí)表空間會(huì)充當(dāng)排序段的數(shù)據(jù)寫(xiě)入。這樣排序動(dòng)作會(huì)從內(nèi)存過(guò)程退化為外存儲(chǔ)過(guò)程。
兩個(gè)現(xiàn)象:如果我們的Temp表空間文件設(shè)置比較小,并且設(shè)置為不可自動(dòng)拓展。同時(shí)我們又希望給一個(gè)很大數(shù)據(jù)表加索引,經(jīng)常會(huì)遇到:create index語(yǔ)句長(zhǎng)時(shí)間運(yùn)行之后報(bào)錯(cuò),說(shuō)Temp表空間不能拓展,操作被停止。索引葉子節(jié)點(diǎn)是有序的,創(chuàng)建索引的過(guò)程也就伴隨著數(shù)據(jù)庫(kù)的排序動(dòng)作。
另一個(gè)現(xiàn)象:如果我們的內(nèi)存設(shè)置不合理,SQL經(jīng)常包括很多“無(wú)意義”的“大排序”。這樣會(huì)發(fā)現(xiàn)我們的Temp空間消耗比較大,一些SQL性能抖動(dòng)比較明顯。
合理的設(shè)置Temp空間管理策略,是應(yīng)用系統(tǒng)架構(gòu)的一個(gè)重要環(huán)節(jié)。
2、給臨時(shí)表指定表空間
Oracle中,用戶(hù)schema和表空間存儲(chǔ)結(jié)構(gòu)對(duì)應(yīng)關(guān)系是很靈活的。如果用戶(hù)有空間配額(Quota),我們是可以在schema中創(chuàng)建任何表空間的數(shù)據(jù)表的,是可以把對(duì)象放置在任何的表空間里面。
但是對(duì)于11g之前,,Temp表空間并不是這樣的。我們創(chuàng)建用戶(hù)之后,需要制定出這個(gè)用戶(hù)schema對(duì)應(yīng)的臨時(shí)表空間。如果我們不指定,Oracle會(huì)選擇系統(tǒng)默認(rèn)臨時(shí)表空間(通常是temp)作為這個(gè)用戶(hù)的臨時(shí)表空間。
至此以后,這個(gè)用戶(hù)所有的臨時(shí)段都是在這個(gè)臨時(shí)表空間上進(jìn)行分配。我們是沒(méi)有能力指定某個(gè)臨時(shí)表分配在其他臨時(shí)表空間里面的。
我們到11g之后,Oracle提供了這樣的自由。
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
當(dāng)前sys用戶(hù)的默認(rèn)表空間為T(mén)EMP。
SQL> select DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE from dba_users where username='SYS';
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ------------------------------
SYSTEM TEMP
此時(shí),數(shù)據(jù)庫(kù)中包括兩個(gè)臨時(shí)表空間。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 1048576 53676604
我們可以創(chuàng)建出一個(gè)不屬于TEMP默認(rèn)臨時(shí)表空間的臨時(shí)表。
SQL> create global temporary table t_temp tablespace temptest as select * from t where 1=0;
Table created
此后的臨時(shí)段分配,都是在temptest表空間上進(jìn)行的。
SQL> insert into t_temp select * from t;
19360512 rows inserted
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 2248146944 3120562176
那么,是不是和數(shù)據(jù)表一樣,支持move操作呢?
SQL> create global temporary table t_temp tablespace temp as select * from dba_objects where 1=0;
create global temporary table t_temp tablespace temp as select * from dba_objects where 1=0
ORA-14451: unsupported feature with temporary table
看來(lái),目前版本還沒(méi)有支持move操作的臨時(shí)表。
更多詳情見(jiàn)請(qǐng)繼續(xù)閱讀下一頁(yè)的精彩內(nèi)容:
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com