轉:
今天開發反映說臨時表空間不夠要求添加臨時表空間,添加完成(添加了30G的臨時表空間)又報臨時表空間的不足,開發又要求是添加,有添加了10G,監控臨時表空間的使用情況,又撐滿了,又添加了30G,最后臨時表空間又撐滿了,最后批處理還是沒有執行,SQL語句的執行是一次性全部執行完成,最后的解決辦法是開發使用游標,一萬條數據一提交或者定量提交,下午監控臨時表空間的使用情況發現使用率 74.91%。不禁有些疑問到底是那些用戶在使用臨時表空間,使用臨時表空間的大小有多大,
在做一些什么操作,SQL語句是什么。
首先要說明一點的是表空間的使用惰性,如果你一下使用幾十個G的臨時表空間,如果SQL語句執行失敗,臨時表空間的釋放需要時間,不會一下全部釋放,這個時候我們檢查臨時表空間的使用率發現使用率已經是99%,如果你擴容臨時表空間,擴容30G,開發又開始執行sql,你會發現臨時表空間使用率蹭蹭的網上增最后又達到了99%,開發的sql又沒有執行過去,還是報臨時表空間不足,而臨時表空間釋放有需要時間,如果開發的非常着急需要執行sql。所以建議dba一次擴容臨時表,擴容大點,
說一下今天處理問題的過程,
1.查詢臨時表空間的使用率:
select c.tablespace_name,
to_char(c.bytes/1024/1024/1024,'99,999.999') total_gb,
to_char( (c.bytes-d.bytes_used)/1024/1024/1024,'99,999.999') free_gb,
to_char(d.bytes_used/1024/1024/1024,'99,999.999') use_gb,
to_char(d.bytes_used*100/c.bytes,'99.99') || '%'use
from (select tablespace_name,sum(bytes) bytes
from dba_temp_files GROUP by tablespace_name) c,
(select tablespace_name,sum(bytes_cached) bytes_used
from v$temp_extent_pool GROUP by tablespace_name) d
where c.tablespace_name = d.tablespace_name;
2.查詢那些用戶在使用
select a.username,
a.sql_id,
a.SEGTYPE,
b.BYTES_USED/1024/1024/1024||‘G’,
b.BYTES_FREE/1024/1024/1024 from V$TEMPSEG_USAGE a join V$TEMP_SPACE_HEADER b on a.TABLESPACE=b.tablespace_name;
解釋username 正在執行sql的用戶名
sql_id 正在執行的sql的的sql_id
segtype 正在執行的SQL語句做的是什么操作
BYTES_USED 正在執行sql語句使用的臨時表空間的大小
BYTES_FREE 剩余多少臨時表空間
大家可以看到這個臨時表空間的有6個數據文件,查詢的結果顯示按照每個臨時的數據文件使用了多少,還剩余多少,又又有一個問題是第一用戶DBSNMP用戶已經把臨時表空間占滿了那么第二個用戶還能使用這個六個數據文件的臨時表空間么,個人理解是六個數據文件中有第一個用戶在使用,也有第二個用戶在使用。
查詢實例中時候是否有大字段在使用臨時表空間:
select * from V$TEMPORARY_LOBS;
關於數據字典V$TEMP_SPACE_HEADER官方文檔的解釋:
V$TEMP_SPACE_HEADER 顯示每個LOCALLY MANAGED臨時表空間的每個文件的聚合信息,包括當前正在使用的空間量以及空間頭中標識的空閑量。
| Column | Datatype | Description |
|---|---|---|
TABLESPACE_NAME |
VARCHAR2(30) |
Name of the temporary tablespace |
FILE_ID |
NUMBER |
Absolute file number |
BYTES_USED |
NUMBER |
How many bytes are in use |
BLOCKS_USED |
NUMBER |
How many blocks are in use |
BYTES_FREE |
NUMBER |
How many bytes are free |
BLOCKS_FREE |
NUMBER |
How many blocks are free |
RELATIVE_FNO |
NUMBER |
The relative file number for the file |
關於V$TEMPSEG_USAGE的官方文檔的解釋:
V$TEMPSEG_USAGE 描述臨時段使用情況。
| 柱 | 數據類型 | 描述 |
|---|---|---|
USERNAME |
VARCHAR2(30) |
請求臨時空間的用戶 |
USER |
VARCHAR2(30) |
此列已過時並維護以便向后兼容。 此列的值始終等於中的值 USERNAME 。 |
SESSION_ADDR |
RAW(4 | 8) |
會話地址 |
SESSION_NUM |
NUMBER |
會話序列號 |
SQLADDR |
RAW(4 | 8) |
SQL語句的地址 |
SQLHASH |
NUMBER |
SQL語句的哈希值 |
SQL_ID |
VARCHAR2(13) |
SQL語句的SQL標識符 |
TABLESPACE |
VARCHAR2(31) |
分配空間的表空間 |
CONTENTS |
VARCHAR2(9) |
指示表是否 TEMPORARY 或 PERMANENT |
SEGTYPE |
VARCHAR2(9) |
排序類型的類型:
|
SEGFILE# |
NUMBER |
初始范圍的文件號 |
SEGBLK# |
NUMBER |
初始范圍的塊號 |
EXTENTS |
NUMBER |
分配給排序的范圍 |
BLOCKS |
NUMBER |
分配給排序的塊中的范圍 |
SEGRFNO# |
NUMBER |
初始范圍的相對文件號 |
關於V$TEMP_EXTENT_POOL的官方文檔中的解釋
V$TEMP_EXTENT_POOL顯示緩存並用於實例的臨時空間的狀態。請注意,臨時空間緩存的加載是惰性的,並且實例可以處於休眠狀態。
| 柱 | 數據類型 | 描述 |
|---|---|---|
TABLESPACE_NAME |
VARCHAR2(30) |
表空間的名稱 |
FILE_ID |
NUMBER |
絕對文件號 |
EXTENTS_CACHED |
NUMBER |
已緩存的范圍數 |
EXTENTS_USED |
NUMBER |
實際使用的范圍數 |
BLOCKS_CACHED |
NUMBER |
緩存的塊數 |
BLOCKS_USED |
NUMBER |
使用的塊數 |
BYTES_CACHED |
NUMBER |
緩存的字節數 |
BYTES_USED |
NUMBER |
使用的字節數 |
RELATIVE_FNO |
NUMBER |
相對文件號 |
關於V$TEMPORARY_LOBS官方文檔解釋
V$TEMPORARY_LOBS 顯示臨時LOB。
| 柱 | 數據類型 | 描述 |
|---|---|---|
SID |
NUMBER |
會話ID |
CACHE_LOBS |
NUMBER |
緩存臨時LOB的數量 |
NOCACHE_LOBS |
NUMBER |
nocache臨時LOB的數量 |
ABSTRACT_LOBS |
NUMBER |
抽象LOB的數量 |
如果書寫過程或者對官方文檔理解有什么錯誤歡迎大家留言。
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/31547066/viewspace-2286048/,如需轉載,請注明出處,否則將追究法律責任。
