TEMP临时表空间 查看占用sql及对象

select d.file_name,d.file_id,d.TABLESPACE_NAME,d.bytes/1024/1024/1024 G_B,d.status,d.AUTOEXTENSIBLE,d.MAXBYTES/1024/1024/1024,d.USER_BYTES/1024/1024/1024 used_G from dba_temp_files d order by used_G desc;


SELECT sysdate,a.username, a.sid, a.serial#, a.osuser, b.blocks, c.sql_text
FROM v$session a, v$sort_usage b, v$sqlarea c
WHERE b.tablespace = 'TEMP'
and a.saddr = b.session_addr
AND c.address= a.sql_address
AND c.hash_value = a.sql_hash_value
AND b.blocks*(select block_size from dba_tablespaces where tablespace_name = b.tablespace) >1024*1024;

SELECT sysdate,a.username, a.sid, a.serial#, a.osuser, b.blocks*8/1024/1024, c.sql_id,c.sql_text
FROM v$session a, v$sort_usage b, v$sqlarea c
WHERE b.tablespace = 'TEMP'
and a.saddr = b.session_addr
AND c.address= a.sql_address
AND c.hash_value = a.sql_hash_value;
SELECT sysdate,a.username, a.sid, a.serial#, a.osuser, b.blocks*8/1024/1024, c.sql_id,c.sql_text
FROM v$session a, v$sort_usage b, v$sqlarea c
WHERE b.tablespace = 'TEMP'
and a.saddr = b.session_addr
AND c.address= a.sql_address
AND c.hash_value = a.sql_hash_value order by 6 desc;

31、10235:用于内存堆检查
alter session set events '10235 trace name context forever, level 1';
38、10262:允许连接时存在内存泄漏
alter session set events '10262 trace name context forever, level 300'; -- 允许存在300个字节的内存泄漏
39、10270:转储共享游标
40、10285:模拟控制文件头部损坏
41、10286:模拟控制文件打开错误
42、10287:模拟归档出错
43、10357:调试直接路径机制
44、10500:跟踪SMON进程
alter session set events '10231 trace name context off'; -- 关闭会话期间的数据块检查
event = "10231 trace name context forever, level 10" -- 对任何进程读入SGA的数据块进行检查


释放临时表空间

1
alter tablespace temp shrink space;
  

--确定TEMP表空间的ts#

1
SELECT TS#, NAME FROM SYS.TS$;
  

--执行清理操作 temp表空间的TS# 为 3*, So TS#+ 1= 4


BEGIN
FOR CUR IN 1 .. 10
LOOP
EXECUTE IMMEDIATE 'alter session set events ''immediate trace name DROP_SEGMENTS level 4''';
END LOOP;
END;
/
  

查看占用temp表空间对象;

set lines 200
col username for a20
col b.BYTES_USED/1024/1024/1024||'G' for a30
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;
 


 

set line 232
set pagesize 49999
set wrap off
col USERNAME for a8
col tablespace for a10
col sql_text for a60
Select se.username,se.sid,se.serial#,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;


  

TEMP临时表空间的数据文件使用情况


SELECT file_id,TABLESPACE_NAME AS TABLESPACE_NAME,BYTES_USED/1024/1024/1024 AS TABLESAPCE_USED_GB,
BYTES_FREE/1024/1024/1024 AS TABLESAPCE_FREE_GB
FROM V$TEMP_SPACE_HEADER
ORDER BY 1 DESC;
  

删除临时表空间文件

1
ALTER TABLESPACE TEMP DROP TEMPFILE '/u01/app/oracle/oradata/GSP/temp02.dbf';

查看temp表空间的使用情况

col bytes_m for a15
col used_% for a15
col name for a15
col used_m for a15
select d.status ,d.tablespace_name name,
       d.contents ,d.extent_management management,
       to_char(nvl(a.bytes/1024/1024,0),'99,999,990.900') bytes_m,
       nvl(t.bytes,0)/1024/1024||'/'||nvl(a.bytes/1024/1024,0) used_m,
       to_char(nvl(t.bytes/a.bytes*100,0),'990.00') used_% 
    from sys.dba_tablespaces d,
        (select tablespace_name,sum(bytes) bytes from dba_temp_files group by tablespace_name) a , 
        (select tablespace_name,sum(bytes_cached) bytes from v$temp_extent_pool group by tablespace_name ) t 
    where d.tablespace_name=a.tablespace_name(+) 
     and d.tablespace_name=t.tablespace_name(+) 
     and d.contents like 'TEMPORARY';

临时表空间 extent management 为local 正常
如果临时表空间使用率高,不可控制smon进程做处理,此时可以如下命令来加快处理
1.alter session set events 'immediate trace name drop_segments level tablespace_number+1';

2.切换temp tablespace
3.建立temp group 

分析使用临时表空间的对象

set lines 300 pages 2000
col username for a10
col machine for a10
col program for a14 trunc 
col event for a20 trunc 
col sqltext for a30
col sql_id for a15 
col wai_secinwait for a10 
col bs for a10 
col ch# for 999
select ses.username,ses.sid,case when ses.state != 'WAITING' then 'On CPU / runqueue' 
                                  else 
								      event 
								   end as event,
		ses.machine,ses.program,ses.status,ses.last_call_et,sql.hash_value,ses.sql_id,
		wait_time||':' || seconds_in_wait wai_secinwait,
		seq#,
		row_wait_obj#,
		substr(sql.sql_text,1,30) sqltext,
		blocking_instance||':'|| blocking_session bs,
		sql_child_number ch# 
	from v$session ses 
	left join v$sql sql 
	on ses.sql_hash_value=sql.hash_value 
	and ses.sql_child_number=sql.child_number 
	where ses.type='USER' 
	and ses.status<> 'INACTIVE' 
	-- and sql_text like 'select t.subsid,s.sernubmer,t%' 
	order by seconds_in_wait,last_call_et,4;

查看临时表空间占用情况

select u.tablespace,u.contents,u.segtype,u.extents,u.blocks,round(((u.blocks*p.value)/1024/1024),2) mb,
s.sql_id from v$session s ,v$sort_usage u,sys.v_$system_parameter p 
where s.saddr=u.session_addr 
and upper(p.name)='DB_BLOCK_SIZE' order by mb;


no rows selected 表示空闲无使用;
配合v$temporary_lobs 


查看真正消耗temp高的sql

select k.inst_id inst_id,
      ktssoses "saddr",
      sid,
      ktssosno "serial#',
      username "username",
      osuser,ktssosqlid "SQL_ID",
      ktssotsn "TABLESPACE",
      decode(ktssocnt,0,'PERMANENT',1,'TEMPORARY') "CONTENTS",
      --注意在12c的v$sort_usage定义中tablespace 和contents已经发生变化了。  decode(ktssosegt,1,'SORT',2,'HASH',3,'DATA',4,'INDEX',5,'LOB_DATA',6,'LOB_INDEX','UNDEFINED') "SEGTYPE",
      ktssofno "SEGFILE#",
      ktssobno "SEGBLK#",
      ktssoexts "EXTNETS",
      ktssoblks "BLOCKS",
      round(ktssoblks*p.value/1024/1024,2) "SIZE_MB",
      ktssorfno "SEGRFNO#" 
    from x$ktsso k ,
    v$session s,
    (select value from v$parameter where name='db_block_size') P 
    where ktssoses = s.saddr 
    and ktssosno=s.serial#;


分析某一时间段内的temp使用情况

select * 
  from (select t.sample_time,s.parsing_schema_name,
        t.sql_id,t.sql_child_number as sql_child,
        round(t.temp_space_allocated/1024/1024/1024,2) ||' G' as temp_used,
        round(t.temp_space_allocated/(select sum(decode(d.autoextensible,'YES',d.maxbytes,d.bytes)) from dba_temp_files d),2) * 100||'%' as temp_pct,
        t.program,
        t.module,
        s.sql_text 
    from v$active_session_history t,v$sql s 
    where t.sample_time> to_date('2024-07-04 10:00:00','yyyy-mm-dd hh24:mi:ss') and 
         t.sample_time < to_date('2024-07-04 11:00:00','yyyy-mm-dd hh24:mi:ss') and t.temp_space_allocated is not null 
         and t.sql_id=s.sql_id 
         order by t.temp_space_allocated desc) 
         where rownum <50 
         order by temp_used desc;


 

<think>我们被要求查找占用Oracle临时表空间SQL语句。根据之前的回答和引用,我们可以从动态性能视图`V$TEMPSEG_USAGE`中获取信息。这个视图记录了当前正在使用临时段的会话和SQL语句。 以下是查询占用临时表空间SQL语句的步骤: ### 1. **查询当前使用临时表空间SQL语句** ```sql SELECT s.sid, s.serial#, s.username, s.osuser, s.program, s.sql_id, t.sql_id AS temp_sql_id, -- 注意:这里可能和s.sql_id不同,因为临时段可能由之前的SQL操作使用 t.contents, t.segtype, t.blocks * (SELECT value/1024/1024 FROM v$parameter WHERE name = 'db_block_size') AS mb_used FROM v$session s, v$tempseg_usage t WHERE s.saddr = t.session_addr ORDER BY mb_used DESC; ``` ### 2. **直接通过`V$TEMPSEG_USAGE`查看SQL信息** ```sql SELECT sql_id, segtype, contents, blocks * (SELECT value/1024/1024 FROM v$parameter WHERE name = 'db_block_size') AS mb_used FROM v$tempseg_usage ORDER BY mb_used DESC; ``` ### 3. **结合`V$SQL`获取SQL文本** ```sql SELECT t.sql_id, s.sql_text, SUM(t.blocks * p.value/1024/1024) OVER (PARTITION BY t.sql_id) AS total_mb_used FROM v$tempseg_usage t, v$sql s, v$parameter p WHERE t.sql_id = s.sql_id(+) AND p.name = 'db_block_size' GROUP BY t.sql_id, s.sql_text, t.blocks, p.value ORDER BY total_mb_used DESC; ``` ### 4. **按SQL_ID聚合临时空间使用量** ```sql SELECT sql_id, segtype, SUM(blocks * (SELECT value/1024/1024 FROM v$parameter WHERE name = 'db_block_size')) AS total_mb_used FROM v$tempseg_usage GROUP BY sql_id, segtype ORDER BY total_mb_used DESC; ``` ### 说明: - `v$tempseg_usage`视图提供了当前临时段的使用情况,包括每个会话、每个SQL使用的临时段大小(以块为单位)[^2]。 - 通过关联`v$session`和`v$sql`视图,我们可以获取更多关于会话和SQL文本的详细信息。 - 计算实际大小时,需要乘以数据库块大小(通过查询`v$parameter`获得)。 ### 注意事项: - 如果`sql_id`为NULL,可能是因为临时段的使用是由PL/SQL块或其它非SQL操作引起的。 - 临时表空间的使用通常由排序、哈希连接、临时表等操作引起,这些操作在SQL执行过程中产生。 ### 示例输出: ``` SQL_ID SEGTYPE MB_USED ------------- ---------- ---------- 8m5z3v7a9qj1d HASH 1024.25 4k9t8d2f1g5h3 SORT 768.50 ... ... ... ``` ### 相关问题: 1. 如何终止占用大量临时表空间的会话? 2. 如何优化消耗大量临时表空间SQL语句? 3. Oracle临时表空间使用率过高有哪些常见原因? 4. 如何设置临时表空间自动扩展以避免空间不足? [^1]: 参考了临时表空间使用情况的查询方法 [^2]: 基于`v$tempseg_usage`视图的查询</think>以下是查找占用 Oracle 临时表空间SQL 语句的详细方法,结合动态性能视图和实用技巧: ### 一、核心查询方法 #### 1. **实时占用 SQL 查询(最常用)** ```sql SELECT a.sid, a.serial#, a.username, a.program, b.sql_id, b.sql_text, c.blocks * (d.value/1024/1024) AS mb_used -- 计算MB占用 FROM v$session a, v$sql b, v$tempseg_usage c, v$parameter d WHERE a.sql_id = b.sql_id AND a.saddr = c.session_addr AND d.name = 'db_block_size' -- 获取块大小 AND c.blocks > 100 -- 过滤小对象 ORDER BY mb_used DESC; ``` > 显示正在消耗临时空间的SQL语句及占用大小[^1][^2] #### 2. **按 SQL_ID 聚合分析** ```sql SELECT sql_id, SUM(blocks * (SELECT value/1024/1024 FROM v$parameter WHERE name='db_block_size')) AS total_mb, COUNT(*) AS active_ops FROM v$tempseg_usage GROUP BY sql_id HAVING SUM(blocks) > 1000 -- 只显示大消耗 ORDER BY total_mb DESC; ``` > 识别消耗临时空间最多的SQL[^2] --- ### 二、高级分析方法 #### 1. **关联 AWR 获取历史 SQL** ```sql SELECT t.sql_id, s.sql_text, SUM(t.temp_space_allocated)/1024/1024 AS max_temp_mb FROM dba_hist_sqlstat t, dba_hist_sqltext s WHERE t.sql_id = s.sql_id AND t.temp_space_allocated > 0 AND t.snap_id BETWEEN &begin_snap AND &end_snap GROUP BY t.sql_id, s.sql_text ORDER BY max_temp_mb DESC; ``` > 分析历史时间段内消耗临时空间最多的SQL[^1] #### 2. **实时监控脚本(每 5 分钟记录)** ```sql CREATE TABLE temp_sql_monitor AS SELECT SYSDATE AS sample_time, sql_id, SUM(blocks * (SELECT value/1024/1024 FROM v$parameter WHERE name='db_block_size')) AS temp_mb FROM v$tempseg_usage GROUP BY sql_id; ``` --- ### 三、关键视图说明 1. **`V$TEMPSEG_USAGE`** 核心视图 - `SQL_ID`: 消耗临时空间的SQL标识 - `BLOCKS`: 占用的块数量 - `SESSION_ADDR`: 关联会话 - `SEGTYPE`: 段类型(SORT/HASH等) 2. **`V$SQL`** - `SQL_TEXT`: SQL完整文本 - `SQL_FULLTEXT`: CLOB格式的SQL 3. **`DBA_HIST_SQLSTAT`** - `TEMP_SPACE_ALLOCATED`: 历史分配的临时空间 --- ### 四、优化建议 1. **识别高消耗操作**: ```sql SELECT segtype, COUNT(*), SUM(blocks) FROM v$tempseg_usage GROUP BY segtype; ``` > 分析排序(SORT) vs 哈希(HASH)操作占比[^3] 2. **终止问题会话**: ```sql ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` 3. **SQL优化方向**: - 检查缺少索引的`ORDER BY/GROUP BY` - 避免不必要的`DISTINCT` - 优化`JOIN`条件和子查询 --- ### 示例输出: ``` SID SERIAL# USERNAME SQL_ID TEMP_MB SQL_TEXT ----- ------- --------- ------------- ------- ------------------------------------ 143 22987 APP_USER 8kt7h3f9j1d2 1024 SELECT ... ORDER BY unindexed_column 892 33112 REPORT_US g5h2d8k3m9n1 768 SELECT ... GROUP BY large_dataset ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值