1. 程式人生 > >消除臨時表空間暴漲的方法

消除臨時表空間暴漲的方法

      關於消除temp ts暴漲的方法
    經常有人問temp表空間暴漲的問題,以及如何回收臨時表空間,由於版本的不同,方法顯然也多種多樣,但這些方法顯示是治標不治本的辦法,只有深刻理解temp表空間快速增加的原因,才能從根本上解決temp ts的問題。

是什麼操作在使用temp ts?
- 索引建立或重建立.
- ORDER BY or GROUP BY
- DISTINCT 操作.
- UNION & INTERSECT & MINUS
- Sort-Merge joins.
- Analyze 操作
- 有些異常將會引起temp暴漲

    所以,在處理以上操作時,dba需要加倍關注temp的使用情況,v$sort_segment字典可以記載temp的比較詳細的使用情況,而v$sort_usage將會告訴我們是誰在做什麼.

sql>select tablespace_name,current_users,total_blocks,used_blocks,free_blocks from v$sort_segment;
TABLESPACE_NAME CURRENT_USERS TOTAL_BLOCKS USED_BLOCKS FREE_BLOCKS
------------------------------- ------------- ----------------- ---------
TEMP 1 63872 30464 33408
SQL>select username,session_addr,sqladdr,sqlhash from v$sort_usage
USERNAME SESSION_ADDR SQLADDR SQLHASH
------------------------------ ------------- --------------- ----------
CYBERCAFE C0000000D7EF99E8 C0000000E1BFE970 4053158416

然後通過多表聯接,我們可以找出更詳細的操作:
SQL>select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value)) as Space,tablespace,segtype,sql_text from v$sort_usage su,v$parameter p,v$session se,v$sql s where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by se.username,se.sid;
USERNAME SID EXTENTS SPACE TABLESPACE SEGTYPE
-------------------- ---------- ---------- ---------- ----------- ---------
SQL_TEXT
-------------------------------------------------------------------------
CYBERCAFE 42 238 249561088 TEMP SORT
select 1 from sys.streams$_prepare_ddl p where ((p.global_flag=1 and :1 is null) or (p.global_flag=0 and p.usrid=:2)) and rownum=1

本例應該是由一些異常引起的,其實大多數情況下sort都會在幾乎內結束,如果在sort操作的若干秒內剛好就捕獲了該SQL,應該走狗屎運的事情,即你知道某個SQL將會發生sort操作,當你想捕抓它們時,發現它們已經sort完了,排序完畢後sort segment會被smon清除。但很多時間,我們則會遇到臨時段沒有被釋放,temp表空間幾乎滿的狀況,這時該如何處理呢?

metalink上推薦的方法收集整理如下
-- 重啟例項
重啟例項重啟時,smon程序會完成臨時段釋放,不過很多的時侯我們的庫是不允許down的,
所以這種方法缺應用機會不多,不過這種方法還是很好用的,如果你的例項在重啟後sort段
沒有被釋放,這種情況就需要慎重對待。
-- 修改引數 (僅適用於8i及8i以下版本)
SQL>alter tablespace temp increase 1;
SQL>alter tablespace temp increase 0;
-- 合併碎片
SQL>alter tablespace temp coalesce;
-- 診斷事件
SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4'
說明:temp表空間的TS#為3,So TS#+1=4
-- 重建temp
SQL>alter database tempfile '......' drop;
SQL>alter tablespace temp add tempfile '......';

可以說,以上的方法都是治標不治本的,因為temp增長過快顯然是由於disk sort過多,造成disk sort的原因也很多,比如sort area較小等原因,當然,sort area設定多大才合理?這個當然需要滿足In-memory Sort大於99%以上哦。

Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %: 100.00 Redo NoWait %: 99.99
Buffer Hit %: 99.36 In-memory Sort %: 100.00
Library Hit %: 99.87 Soft Parse %: 99.84
Execute to Parse %: 1.17 Latch Hit %: 99.96
Parse CPU to Parse Elapsd %: 92.00 % Non-Parse CPU: 94.59

排序區域的分配
- 專用伺服器分配sort area.
排序區域在PGA.
- 共享伺服器分配sort area.
排序區域在UGA. (UGA在shared pool中分配).

在9i以前的版本,由sort_area_size決定sort area的分配,在9i及以後的版本,當workarea_size_policy等auto時,由pga_aggregate_target引數決定sortarea的大於,這時的sort area應該是pga總記憶體的5%.當workarea_size_policy等manual時,sort area的大小還是於sort_area_size決定.

無論是那個版本,如果sort area開得過小,In-memory Sort率較低,那temp表空間肯定會增長得很快,如果開得較高,在C/S結構中將會導致記憶體消耗嚴重(長連線較多).由於smon程序每隔5分鐘都要對不再使用的sort segment進行回收,如果你不想讓smon回收sort segment的話,可以使用以下兩個event寫入初始化引數檔案,然後
重啟例項,這樣如果你的磁碟排序較多,很快就會漲暴磁碟......

event="10061 trace name context forever, level 10" //禁止加收
event="10269 trace name context forever, level 10" //禁止合併碎片

通過合理地設定pga或sort_area_size,可以消除大部分的dist sort,那其它的disk sort該如何處理呢?從sort引起的原因來看,索引/分析/異常引起的disk sort應該是很少的一部分,其它的應該是select中的distinct/union/group by/order by以及merge sort join啦,那我們如何捕獲這些操作呢?通常如何有磁碟排序的SQL,它的邏輯讀/物理讀/排序/執行時間等都是比較大的,所以我們可以對v$sqlarea或v$sql字典進行過濾,經過長期地監控資料庫,相信可以把這些害群之馬找出來.即然找出這些引起disk sort的SQL後怎麼辦呢?當然是對SQL進行分析,盡而優化之。
[[email protected] sql]$ more show_sql.sh
#!/bin/bash
sqlplus -s aaa/bbbcol sql_text format a81
col disk_reads format 999999.99
col bgets_per format 99999999.99
col "ELAPSD_TIME(s)" format 9999.99
col "cpu_time(s)" format 9999.99
set long 99999999999
set pagesize 9999
select address,hash_value,disk_reads/executions disk_reads,elapsed_time/1000000/executions as "ELAPSD_TIME(s)",
buffer_gets/executions bgets_per,executions,first_load_time as first_time,sql_text
from v$sql
where executions > 0 and (disk_reads/executions > 500 or buffer_gets/executions > 20000) and command_type = 3
order by 3,4;

--select s.disk_reads,s.buffer_gets/s.executions bgets_per,first_load_time,st.sql_text
-- from v$sql s,v$sqltext_with_newlines st
--where s.address=st.address and s.hash_value=st.hash_value
-- and s.disk_reads > 1000 or (s.executions > 0 and s.buffer_gets/s.executions > 50000)
--order by st.piece;
exit
!

總結,如何從根本上降低temp表空間的膨脹呢?方法有2個:
1 設定合理的pga或sort_area_size
2 優化引起disk sort的sql

相關推薦

消除臨時空間暴漲方法

      關於消除temp ts暴漲的方法     經常有人問temp表空間暴漲的問題,以及如何回收臨時表空間,由於版本的不同,方法顯然也多種多樣,但這些方法顯示是治標不治本的辦法,只有深刻理解temp表空間快速增加的原因,才能從根本上解決temp ts的問題。 是什麼操

臨時空間過大解決方法

臨時表空間臨時表空間過大解決方法解決臨時表空間過大有兩種方法,方法一增加臨時表空間的大小,方法二重建臨時表空間,解決臨時表空間過大的問題。方案一:增加臨時表空間的大小--1.臨時表空間的使用情況SELECT D.tablespace_name, SPACE "SUM_SPACE(M)&

oracle 空間擴容方法

oracle 表空間擴容方法測試環境OS:RedHat 6.7Oracle:11.2.0.4[[email protected]/* */ ~]# su - oracle[[email protected]/* */ ~]$ sqlplus / as sysdbaSQL*Plus: R

ORACLE臨時空間總結

datafile 資源 indicate height 完成 round clip blocks rip 臨時表空間概念 臨時表空間用來管理數據庫排序操作以及用於存儲臨時表、中間排序結果等臨時對象,當ORACLE裏需要用到SORT的時候,並且當PGA中sort_ar

oracle下正確刪除空間方法

oracle tablespace Oracle因為本身的多重驗證機制所有在刪除表空間時不像MySQL中刪除database一樣,可以通過外部的刪除直接刪除掉database文件夾就可以刪除掉database,當然這兩者是2種不同的東西,在此僅用於舉例說明。在Oracle中表空間相當於系統中的硬

臨時空間操作總結

con database 成功 1.5 size ane stripe ont table 一、 臨時表空間理論 在9i之前,如果一個數據庫用戶沒有被指定默認臨時表空間,那麽oracle就會使用system表空間作為該用戶的臨時表空間,這是很危險的。在9i裏面,databa

oracle 臨時空間 占用磁盤空間

oracle 臨時表空間新創建一個臨時表空間 tmpacreate temporary tablespace TEMPA TEMPFILE ‘/oracle/tmp/tempa01.dbf ‘ SIZE 8192M REUSE AUTOEXTEND ON NEXT

oracle 11g解決臨時空間過大的問題

temp tablespace有的數據庫在使用過程中由於某些操作會導至臨時表空間過大,由於臨時表空間的工作機制,在作業完成後該部分臨時表空間也不會釋放。通過重建臨時表空間的方法可以解決這個問題,但操作還是有點繁瑣。在操作中發現,通過resize tempfile可以釋放臨時表空間,如果有多個tempfile,

oracle創建用戶、空間臨時空間、分配權限步驟詳解

分配權限 use 表數據 依次 log auto create 過程 limit 首先登陸管理員賬號,或者有DBA權限的用戶,接下來依次: --查詢所有用戶select * from dba_users;--創建新用戶create user gpmgt identified

ORA-1652:臨時空間異常優化處理

ora-1652 temp is-not-null 優化 1、查看 alert_PROD.log 【錯誤信息】:ORA-1652: unable to extend temp segment by 128 in tablespace TEMP1 查看臨時表空間基礎信息及其使用情況:基礎信

Oracle臨時空間使用分析

臨時表空間查詢臨時表空間的使用情況: select * from (select a.tablespace_name,sum(maxbytes/1024/1024/1024) total_G,sum(a.bytes/1024/1024) allocated_mbfrom dba_temp_files awhe

oracle 臨時空間使用情況

HA 空間占用 limited 空間使用 ase hash join sel ted 不足 今天用戶那邊執行一個很簡單的SQL,輸出結果集也才幾萬條,涉及三表,最大也才100萬數據量,結果卻報了表空間不足的情況,理論來說,這樣的SQL怎麽也不應該吃這麽多臨時表空間。 查詢臨

oracle建立使用者,空間臨時空間,分配許可權步驟詳解

首先登陸管理員賬號,或者有DBA許可權的使用者,接下來依次: --查詢所有使用者 select * from dba_users; --建立新使用者 create user gpmgt identified by GPMGT; --檢視所有使用者所在表空間 select usernam

解決Oracle臨時空間佔滿的問題

正常來說,在完成Select語句、create index等一些使用TEMP表空間的排序操作後,Oracle是會自動釋放掉臨時段的。但有些有侯我們則會遇到臨時段沒有被釋放,TEMP表空間幾乎滿的狀況,甚至是我們重啟了資料庫仍沒有解決問題。這個問題在論壇中也常被網友問到,下面我總結一下,給出幾

oracle建立空間、使用者、許可權 oracle 建立臨時空間/空間,使用者及授權

原連結:https://www.cnblogs.com/wxm-bk/p/6510654.html oracle 建立臨時表空間/表空間,使用者及授權   1:建立臨時表空間 create temporary tablespace user_temp tempfile

【DB2】SQL1585N 由於沒有具有相容頁面大小的可用系統臨時空間,因此無法建立臨時。SQLSTATE=54048

自己寫了一段SQL,SQL中包含ORDER BY 字句,但是在執行的時候報錯如下: 經過查詢發現是由於臨時表空間的PAGESIZE不夠大,可考慮建16k或者32k PAGESIZE的表空間 示例如下: 1. 建立pagesize 16k的bufferpool,自己去調大小 db2 create b

【DB2】SQL1585N 由於沒有具有兼容頁面大小的可用系統臨時空間,因此無法創建臨時。SQLSTATE=54048

ref width ace create com sys isp img wid 自己寫了一段SQL,SQL中包含ORDER BY 字句,但是在執行的時候報錯如下:經過查詢發現是由於臨時表空間的PAGESIZE不夠大,可考慮建16k或者32k PAGESIZE的表空間示例如

臨時空間日常維護處理

Oracle臨時表空間主要用來做查詢和存放一些緩衝區資料。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序 監控臨時表空間: COL TEMP_FILE FOR A60; SELECT ROUND((F.BYTES_FREE + F.BYTES_USED)/1024/1024/1024, 2) AS "

mysql1033錯誤 InnoDB臨時空間報錯

問題簡介 1 資料庫5.0無法開啟innodb的表,只能開啟mysam表 2 資料庫5.0啟動異常,無法正常啟動 3 資料庫5.0崩潰,無法正常備份,無法正常匯入匯出 報錯提示 1 用mysql的時候出現1033-Incorrect information in file:“.\資料庫名\