医保飞行检查中会对审计期的医疗数据进行数据审计,一般都会涉及到多表联合查询,这些跨年的数据查询会大量占用临时表空间。
往往查询到一半时会报 ORA-01652 的错误。这个错误是如何发生的,如何规避?
临时表空间用于缓存数据查询的中间结果,比如排序操作、多表的连接、集合操作等。当PGA不足以处理全部操作时,Oracle 会将中间数据转移至临时表空间。当临时表空间也装不下时,就会报 ORA-01652 错误。
遇到 ORA-01652 错误时,简单粗暴的做法是对临时表空间进行扩容,当启用 OMF 时可以不用管文件路径。
alter tablespace TEMP add tempfile autoextend on;
如果没有启用 OMF,则需要指定 tempfile 文件路径:
ALTER TABLESPACE TEMP
ADD TEMPFILE '/u02/oracle/data/lmtemp02.dbf' SIZE 2M autoextend on;
使用 show parameter 命令可以查询数据库是否启用了 OMF
一味地通过添加 tempfile 扩容并不能可视化地了解具体临时表空间需要扩多大。一个tempfile最多可以提供32G的空间,如果查询涉及的表特别大,多表联合查询形成笛卡儿积之后数据量会难以估计。
可以通过观察会话对临时表空间的使用量来评估具体需要如何对临时表空间进行扩容:
SELECT s.inst_id,
s.sid,
s.serial#,
s.username,
s.program,
t.tablespace,
t.segtype,
t.blocks *
(SELECT value FROM v$parameter WHERE name = 'db_block_size') / 1024 / 1024 AS mb_used
FROM gv$session s, gv$tempseg_usage t
WHERE s.saddr = t.session_addr
ORDER BY mb_used DESC;
通过对动态性能视图v$tempseg_usage进行观察,可以实时观察会话对临时表空间的占用情况。以上例子会话的排序操作占用了近30G的临时表空间。如果SQL查询占用了太多临时表空间,则需要对SQL进行改写,比如减少不必要的排序操作。
以上是针对多实例的场景,如果是单实例需要将 gv$ 改为 v$ ,去掉 g。
对临时表空间进行观察的语句还有:
select t.* from v$temp_space_header t order by 2;
select t.* from dba_temp_free_space t;
SELECT
bytes / 1024 / 1024 AS total_mb,
blocks * (SELECT value FROM v$parameter WHERE name = 'db_block_size') / 1024 / 1024 AS used_mb,
t.*
FROM v$tempfile t;
临时数据在会话结束或事务完成后会自动释放,不会永久保存。所以如果是对某个用户单独优化,可以不用对默认临时表空间进行扩容,而是单独为某个用户创建一个临时表空间,用完后再移除。
create temporary tablespace temp2
tempfile '/u01/app/oracle/oradata/PROD/temp02.dbf' size 10m;
alter tablespace temp2 add tempfile
'/u01/app/oracle/oradata/PROD/temp03.dbf' size 5m;
select file_id,file_name,tablespace_name
from dba_temp_files;
-- 查看默认临时表空间
select PROPERTY_NAME,PROPERTY_VALUE from database_properties
where property_name like 'DEFAULT%';
-- 为用户指定单独的临时表空间
alter user scott temporary tablespace temp2;
注:
[01652 ]$ oerr ora
01652, 00000, "unable to extend temp segment by %s in tablespace %s"
// *Cause: Failed to allocate an extent of the required number of blocks for
// a temporary segment in the tablespace indicated.
// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or more
// files to the tablespace indicated.
[ ]$
OCP考点:
-
default temporary tablespace 不能 offline,但 temporary file 可以 offline
全文完。
原文始发于微信公众号(生有可恋):Oracle 临时表空间使用量监测
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论