[Oracle] 中的Temporary tablespace的作用


臨時表空間主要用途是在數據庫進行排序運算[如創建索引、order by及group by、distinct、union/intersect/minus/、sort-merge及join、analyze命令]、管理索引[如創建索引、IMP進行數據導入]、訪問視圖等操作時提供臨時的運算空間,當運算完成之后系統會自動清理。

當臨時表空間不足時,表現為運算速度異常的慢,並且臨時表空間迅速增長到最大空間(擴展的極限),並且一般不會自動清理了。

如果臨時表空間沒有設置為自動擴展,則臨時表空間不夠時事務執行將會報ora-01652 無法擴展臨時段的錯誤,當然解決方法也很簡單:1、設置臨時數據文件自動擴展,或者2、增大臨時表空間。


 

臨時表空間的相關操作:

查詢默認臨時表空間:

SQL> select * from database_properties where property_name=’DEFAULT_TEMP_TABLESPACE’;

PROPERTY_NAME

——————————

PROPERTY_VALUE

——————————————————————————–

DESCRIPTION

——————————————————————————–

DEFAULT_TEMP_TABLESPACE

TEMP

Name of default temporary tablespace

查詢臨時表空間狀態:

SQL> select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_files;

TABLESPACE_NAME

——————————

FILE_NAME

——————————————————————————–

FILE_SIZE AUT

———- —

TEMP

/u01/app/oracle/oradata/orcl/temp01.dbf

100 YES

擴展臨時表空間:

方法一、增大臨時文件大小:

SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize 100m;

Database altered.

方法二、將臨時數據文件設為自動擴展:

SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend on next 5m maxsize unlimited;

Database altered.

方法三、向臨時表空間中添加數據文件:

SQL> alter tablespace temp add tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ size 100m;

Tablespace altered.

刪除臨時表空間的一個數據文件:

SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ drop;

Database altered.

刪除臨時表空間(徹底刪除):

SQL> drop tablespace temp1 including contents and datafiles cascade constraints;

Tablespace dropped.

創建臨時表空間:

SQL> create temporary tablespace temp1 tempfile ‘/u01/app/oracle/oradata/orcl/temp11.dbf’ size 10M;

Tablespace created.

更改系統的默認臨時表空間:

SQL> alter database default temporary tablespace temp1;

Database altered.

所有用戶的默認臨時表空間都將切換為新的臨時表空間:

SQL> select username,temporary_tablespace,default_ from dba_users;

USERNAME TEMPORARY_TABLESPACE

—————————— ——————————

MGMT_VIEW TEMP1

SYS TEMP1

SYSTEM TEMP1

DBSNMP TEMP1

SYSMAN TEMP1

SCOTT TEMP1

OUTLN TEMP1

MDSYS TEMP1

ORDSYS TEMP1

EXFSYS TEMP1

DMSYS TEMP1

USERNAME TEMPORARY_TABLESPACE

—————————— ——————————

WMSYS TEMP1

CTXSYS TEMP1

ANONYMOUS TEMP1

XDB TEMP1

ORDPLUGINS TEMP1

SI_INFORMTN_SCHEMA TEMP1

OLAPSYS TEMP1

ORACLE_OCM TEMP1

TSMSYS TEMP1

BI TEMP1

PM TEMP1

更改某一用戶的臨時表空間:

SQL> alter user scott temporary tablespace temp;

User altered.

SQL> select username,temporary_tablespace from dba_users;

USERNAME TEMPORARY_TABLESPACE

—————————— ——————————

MGMT_VIEW TEMP1

SYS TEMP1

SYSTEM TEMP1

DBSNMP TEMP1

SYSMAN TEMP1

SCOTT TEMP

OUTLN TEMP1

MDSYS TEMP1

ORDSYS TEMP1

EXFSYS TEMP1

DMSYS TEMP1

USERNAME TEMPORARY_TABLESPACE

—————————— ——————————

WMSYS TEMP1

CTXSYS TEMP1

ANONYMOUS TEMP1

XDB TEMP1

ORDPLUGINS TEMP1

SI_INFORMTN_SCHEMA TEMP1

OLAPSYS TEMP1

ORACLE_OCM TEMP1

TSMSYS TEMP1

BI TEMP1

PM TEMP1

USERNAME TEMPORARY_TABLESPACE

—————————— ——————————

MDDATA TEMP1

IX TEMP1

SH TEMP1

DIP TEMP1

OE TEMP1

HR TEMP1

28 rows selected.

 

 

**************************************************************************************

Oracle臨時表空間主要用來做查詢和存放一些緩沖區數據。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序。 重啟數據庫可以釋放臨時表空間,如果不能重啟實例,而一直保持問題sql語句的執行,temp表空間會一直增長。直到耗盡硬盤空間。 網上有人猜測在磁盤空間的分配上,oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那么臨時表空間就是1GB。也就是說當前臨時表空間文件的大小是歷史上使用臨時表空間最大的大小。 臨時表空間的主要作用: 索引create或rebuild Order by 或 group by Distinct 操作 Union 或 intersect 或 minus Sort-merge joins analyze

 

***************************************************************************************

在Oracle數據庫中進行排序、分組匯總、索引等到作時,會產生許多的臨時數據。如有一張員工內容表,數據庫中是安裝記錄建立的時間來保存的。如果用戶查詢時,使用Order BY排序語句指定按員工編號來排序,那么排序后產生的所有記錄就是臨時數據。對於這些臨時數據,Oracle數據庫是如何處理的呢?

通常情況下,Oracle數據庫會先將這些臨時數據存放到內存的PGA(程序全 局區)內。在這個程序全局區中有一個啼做排序區的地方,專門用來存放這些因為排序操作而產生的臨時數據。但是這個分區的容量是有限的。當這個分區的大小不 足以容納排序后所產生的記錄時,數據庫系統就會將臨時數據存放到臨時表空間中。這就是臨時表空間的來歷。看起來好像這個臨時表空間是個臨時工,對於數據庫 的影響不會有多大。其實大家這是誤解這個臨時表空間了。在用戶進行數據庫操作時,排序、分組匯總、索引這些作業是少不了,其會產生大量的臨時數據。為此基 本上每個數據庫都需要用到臨時表空間。而如果這個臨時表空間設置不當的話,則會給數據庫功能帶來很大的負面影響。為此管理員在維護這個臨時表空間的時候, 不能夠掉以輕心。要避免因為臨時表空間設置不當影響數據庫的功能。具體來說,主要需要注視如下幾個方面的內容。

一、創建用戶時要記得為用戶創建臨時表空間。

最好在創建用戶時為用戶指定臨時表空間。如可以利用語句default temporary table space語句來為數據庫設置默認的臨時表空間。不過在Oracle數據庫中這個不是強制的。但是筆者強烈建議這么做。因為如果沒有為用戶指定默認臨時表 空間的話,那么當這個用戶因為排序等操作需要使用到臨時表空間的話,數據庫系統就會“自作聰明”的利用系統表空間SYSTEM來創建臨時段。眾所周知,這 是一個系統表空間。總因為在這個表空間中存放着系統運行相關的數據,特別的建議是用戶的數據不能夠保存在這個表空間中。那么如果將用戶的臨時表空間防止在 這個系統表空間之內,會產生什么負面影響呢?

總因為臨時表空間中的數據是臨時的。為此數據庫系統需要頻繁的分配和釋放臨時 段。這些頻繁的操作會在系統表空間中產生大量的存儲碎片。當這些存儲碎片比較多時,就會影響系統讀取硬盤的效率,從而影響數據庫的功能。其次系統表空間的 大小往往是有限制的。此時臨時段也來插一腳,就會占用系統表空間的大小。

為此數據庫管理員需要注視一點,當沒有為用戶指定臨時表空間時,用戶排序等操作 仍然需要用到臨時段。此時數據庫系統就會將臨時段放入到系統表空間中。為此就會對數據庫的功能產生不利的影響。所以筆者建議各位讀者與數據庫管理員,在創 建用戶的時候同時為用戶指定一個默認的表空間,以減少臨時段對系統表空間的占用。

二、合理設置PGA,減少臨時表空間使用的幾率。

當排序操作產生臨時數據時,數據庫並不是立即將其存儲在臨時表空間中。通常情況 下,會先將這些臨時數據存儲在內存的PGA程序全局區內。只有當這個程序全局區無法容納全部數據時,數據庫系統才會啟用臨時表空間中的臨時段來保存這些數 據。但是眾所周知,操作系統從內存中讀取數據要比從硬盤中讀取數據塊幾千倍。為此比較理想的情況是,這個程序全局區足夠的大,可以容納所有的臨時數據。此 時數據庫系統就永遙用不到臨時表空間了。從而可以提高數據庫的功能。 網站建設 Www.Cx-Web.Com

但是這畢竟只是一個理想。總因為內存大小等多方面的限制,這個PGA程序區的大 小往往是有限制的。所以在進行一些大型的排序操作時,這個臨時表空間仍然少不了。如今數據庫管理員可以做的就是合理設置這個PGA程序全局區的大小,盡量 減少臨時表空間使用的幾率。如在實際工作中,數據庫管理員可以根據需要來設置初始化參數SORT_AREA_SIZE參數。這個參數主要控制這個PGA程 序全局區內排序區的大小。通常情況下,如果這個數據庫系統主要用來查詢並且需要大量的排序、分組匯總、索引等操作時,那么可以合適調整這個參數,來擴大 PGA分區的大小。相反,如果這個系統主要用於升級操作,或者在這個數據庫服務器上還部署由其他的應用程序,那么這個PGA分區就不能夠占用太多的內存, 以防止對其他應用程序產生不利的影響。所以說,數據庫官員不能夠一刀切,需要根據實際情況來調整。在必要的情況下,可以增添系統內存來增添PGA分區的大 小,從而降低臨時表空間的使用幾率,以提高數據庫的排序、分組匯總等操作的功能。 BaiKe.Cx-Web.Com

總之,如果臨時段被頻繁使用的話,總因為內存與硬盤在功能上的差異,從而會降低 數據庫的功能。為此在平時工作中,數據庫管理員還需要監控臨時表空間的使用情況,以判斷是否需要采取措施來減少臨時表空間的使用來提高數據庫的查詢功能。 為了實現這個目的,筆者建議數據庫管理員可以查看 v$sort_segment這張動態功能視圖。通過這張動態功能視圖可以查看系統排序段(臨時段的一種)的使用情況。另外通過動態功能視圖 v$sort_usage還可以查詢使用排序段的用戶與會話內容。從而為數據庫管理員優化數據庫功能提供數據上的支持。對於這個排序段,筆者還要說明一 點。對於排序段來說,同一個例程的所有SQL語句(如果需要排序操作的話)都將共享同一個排序段。並且排序段在第一次需要用到時被創建。排序完成后這個排 序段不會被釋放,只有在這個歷程關閉后排序段才會被釋放。為此以上兩張視圖要綜合起來分析,才能夠得到數據庫管理員想要的內容。

三、要為臨時表空間保留足夠的硬盤空間。 網站設計,Www.Cx-Web.Com

其他表空間對應的數據文件,在其創建時就會被完全分配和初始化,即在其創建時就 會被分配存儲空間。但是臨時表空間對應的臨時文件則不同。如在 Linux操作系統中,臨時表空間創建時系統是不會分配和初始化臨時文件的。也就是說,不會為臨時文件分配存儲空間。只有臨時數據出現需要用到臨時文件的 時候,系統才會在硬盤上分配一塊地方用來保存臨時文件。此時就可能會產生一個問題,即當需要用到臨時文件系統為其分配空間的時候,才會先系統分區中沒有足 夠的存儲空間了。此時就會產生一些難以預料的后果。 網站建設 

為此對於這些臨時文件,數據庫管理員最好能夠預先為其保留足夠的空間。如在 Linux操作系統中,可以將其防止在一個獨立的分區內,不允許其他應用程序使用。如此的話,就不用擔憂臨時文件沒有地方存儲了。另外總因為臨時表空間主 要用來存放一些排序用的臨時文件。為此如果能夠將這個臨時表空間存放在功能比較好的分區中,還可以提高數據庫系統讀取臨時表空間中數據的速度。另外總因為 系統需要頻繁分配臨時表空間中的數據,為此臨時表空間所在的分區會出現比較多的碎片。此時如果將臨時表空間存放在一個獨立的分區內,那么數據庫管理員就可 以單獨對這個分區進行碎片整理,從而提高這個分區的功能。所以無論出於什么原因,將臨時表空間防止在一個獨立的分區內,是一個不錯的想法。不僅可以保證臨 時文件有存儲的空間,而且還可以提高數據庫的功能。 BaiKe.Cx-Web.Com

對於臨時表空間最后需要說明的是,默認情況下這個臨時表空間對各個用戶都是共享的。也就是說每個連接到數據庫的用戶都可以使用默認的臨時表空間。數據庫管理員可以為其指定其他的臨時表空間。特別來說,只需要一個臨時表空間即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM