2013年9月2日

          Oracle 臨時表空間暴漲(轉)

          http://blog.csdn.net/weikaifenglove/article/details/4059258            昨天在做測試的時候發現一個非常奇怪的問題:在程序的查詢模塊中做查詢的時候,開始速度很快,但是過了一段時間以后速度就變慢,最后干脆就報錯,不工作了。在排錯的過程中,發現Oracle臨時表空間暴漲,達到了幾十個GB,在Oracle中對Session進行跟蹤,發現磁盤空間還在不停的消耗,幾乎是每隔5s,臨時表空間就會增長500MB左右,最后報錯的原因應該是因為沒有磁盤空間可以分配造成的。這是一件十分恐怖的事情。

                  我們知道Oracle臨時表空間主要是用來做查詢和存放一些緩存的數據的,磁盤消耗的一個主要原因是需要對查詢的結果進行排序,如果沒有猜錯的話,在磁盤空間的(內存)的分配上,Oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那么臨時表空間就是1GB,如果還有增長,那么依此類推,臨時表空間始終保持在一個最大的上限。像上文提到的恐怖現象經過分析可能是以下幾個方面的原因造成的。
                  1. 沒有為臨時表空間設置上限,而是允許無限增長。但是如果設置了一個上限,最后可能還是會面臨因為空間不夠而出錯的問題,臨時表空間設置太小會影響性能,臨時表空間過大同樣會影響性能,至于需要設置為多大需要仔細的測試。
                  2.查詢的時候連表查詢中使用的表過多造成的。我們知道在連表查詢的時候,根據查詢的字段和表的個數會生成一個迪斯卡爾積,這個迪斯卡爾積的大小就是一次查詢需要的臨時空間的大小,如果查詢的字段過多和數據過大,那么就會消耗非常大的臨時表空間。
                 3.對查詢的某些字段沒有建立索引。Oracle中,如果表沒有索引,那么會將所有的數據都復制到臨時表空間,而如果有索引的話,一般只是將索引的數據復制到臨時表空間中。
                 針對以上的分析,對查詢的語句和索引進行了優化,情況得到緩解,但是需要進一步測試。

                 總結:
                 1.SQL語句是會影響到磁盤的消耗的,不當的語句會造成磁盤暴漲。
                 2.對查詢語句需要仔細的規劃,不要想當然的去定義一個查詢語句,特別是在可以提供用戶自定義查詢的軟件中。
                 3.仔細規劃表索引。

          臨時表空間使用注意:
          1.臨時表空間 是用于在進行排序操作(如大型查詢,創建索引和聯合查詢期間存儲臨時數據)
          每個用戶都有一個臨時表空間
          2.對于大型操作頻繁,(大型查詢,大型分類查詢,大型統計分析等),應指定單獨的臨時表空間,以方便管理

          3.分配用戶單獨臨時表空間,一般是針對 大型產品數據庫,OLTP數據庫,數據庫倉庫
          對于小型產品不需要單獨制定臨時表空間,使用默認臨時表空間
          原文鏈接:
          http://blog.csdn.net/weikaifenglove/article/details/4059258

          posted @ 2013-09-02 13:51 Alter 閱讀(281) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 山阴县| 汪清县| 丰顺县| 崇礼县| 和硕县| 沧源| 东乡族自治县| 霍山县| 九江县| 凤台县| 绩溪县| 敖汉旗| 峨边| 余江县| 富蕴县| 阳新县| 东城区| 肃宁县| 永顺县| 中西区| 铜鼓县| 边坝县| 银川市| 宿州市| 深圳市| 志丹县| 乌兰县| 密云县| 容城县| 肃北| 南宫市| 河间市| 城市| 绿春县| 出国| 三亚市| 光山县| 鹿泉市| 吴忠市| 瓮安县| 乐安县|