一、暫存資料表空間主要使用在以下幾種情況:
1、order by or group by (disc sort佔主要部分);
2、索引的建立和重建立;
3、distinct操作;
4、union & intersect & minus sort-merge joins;
5、Analyze 操作;
6、有些異常也會引起TEMP的暴漲。
Oracle暫存資料表空間暴漲的現象經過分析可能是以下幾個方面的原因造成的:
1. 沒有為暫存資料表空間設定上限,而是允許無限增長。但是如果設定了一個上限,最後可能還是會面臨因為空白間不夠而出錯的問題,暫存資料表空間設定太小會影響效能,暫存資料表空間過大同樣會影響效能,至於需要設定為多大需要仔細的測試。
2.查詢的時候連表查詢中使用的表過多造成的。我們知道在連表查詢的時候,根據查詢的欄位和表的個數會產生一個迪斯卡爾積,這個迪斯卡爾積的大小就是一次查詢需要的臨時空間的大小,如果查詢的欄位過多和資料過大,那麼就會消耗非常大的暫存資料表空間。
3.對查詢的某些欄位沒有建立索引。Oracle中,如果表沒有索引,那麼會將所有的資料都複製到暫存資料表空間,而如果有索引的話,一般只是將索引的資料複製到暫存資料表空間中。
針對以上的分析,對查詢的語句和索引進行了最佳化,情況得到緩解,但是需要進一步測試。
總結:
1.SQL語句是會影響到磁碟的消耗的,不當的語句會造成磁碟暴漲。
2.對查詢語句需要仔細的規劃,不要想當然的去定義一個查詢語句,特別是在可以提供使用者自訂查詢的軟體中。
3.仔細規劃表索引。如果暫存資料表空間是temporary的,空間不會釋放,只是在sort結束後被標記為free的,如果是 permanent的,由SMON負責在sort結束後釋放,都不用去手工釋放的。查看有哪些使用者和SQL導致TEMP增長的兩個重要視圖:v$ sort_usage和v$sort_segment。
通過查詢相關的資料,發現解決方案有如下幾種:
二、暫存資料表的類型
建立Oracle 暫存資料表,可以有兩種類型的暫存資料表:
會話級的暫存資料表
事務級的暫存資料表 。
1) 會話級的暫存資料表因為這這個暫存資料表中的資料和你的當前會話有關係,當你當前SESSION 不退出的情況下,暫存資料表中的資料就還存在,而當你退出當前SESSION 的時候,暫存資料表中的資料就全部沒有了,當然這個時候你如果以另外一個SESSION 登陸的時候是看不到另外一個SESSION 中插入到暫存資料表中的資料的。即兩個不同的SESSION 所插入的資料是互不相干的。當某一個SESSION 退出之後暫存資料表中的資料就被截斷(truncate table ,即資料清空)了。會話級的暫存資料表建立方法:
Create Global Temporary Table Table_Name (Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;
2) 事務級暫存資料表是指該暫存資料表與事務相關,當進行事務提交或者交易回復的時候,暫存資料表中的資料將自行被截斷,其他的內容和會話級的暫存資料表的一致(包括退出SESSION 的時候,事務級的暫存資料表也會被自動截斷)。事務級暫存資料表的建立方法:
Create Global Temporary Table Table_Name (Col1 Type1,Col2 Type2...) On Commit Delete Rows ;