一、问题背景
TEMP 表空间完全由达梦数据库自动维护。当 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
TEMP 表空间可自动扩充,为了不影响磁盘空间的使用,通常会通过 ini 参数TEMP_SIZE配置大小,TEMP_SPACE_LIMIT设置上限,通过存储过程SP_TRUNC_TS_FILE来收缩 TEMP 表空间文件。
生产环境中要针对 TEMP 表空间的大小做专项检查,经常过大可能说明内存过小或者存在大量排序或者中间结果集存放,需要视情况开展优化工作。
一般执行SQL报错-502: 临时表空间不足是因为SQL占用了过多的临时表空间,需要关注下SQL执行效率如何,如果SQL存在大量排序操作,或者表关联查询中间临时结果集缓存比较大都有可能造成临时表空间暴涨。
二、问题解决
查询使用临时表空间多的SQL
SELECT
TOP 20 EXEC_ID,
MTAB_USED_BY_M || 'MB' AS 使用临时表空间大小,
MTAB_TYPE,
START_TIME,
END_TIME,
SQL_TEXT
FROM
V$MTAB_USED_HISTORY
ORDER BY
2 DESC,
START_TIME DESC;
将上面查询到的SQL找出来,查看执行计划,优化能够减少占用的地方。
三、其他方法
3.1 修改TEMP数据文件大小
修改临时表空间500M 或 10G,静态参数,需要重启生效,
不管TEMP自动扩展到多大,或是新增了TEMP文件,重启数据库后,TEMP会回到初始参数大小。
SP_SET_PARA_VALUE(2,'TEMP_SIZE',500);
SP_SET_PARA_VALUE(2,'TEMP_SIZE',10240);
3.2 TEMP数据文件自动扩展
查询临时表空间上限
SELECT NAME,TYPE,VALUE FROM V$PARAMETER WHERE NAME = 'TEMP_SPACE_LIMIT';
设置临时表空间上限为100G,动态参数:
SP_SET_PARA_VALUE(1,'TEMP_SPACE_LIMIT',102400);
说明:临时表空间大小上限,单位 MB。0 表示不限制临时表空间大小。取值范围 0~4294967294。
2.3 TEMP表空间增加数据文件
ALTER TABLESPACE TEMP ADD DATAFILE '/data/dmdata/DAMENG/TEMP01.DBF' SIZE 100;
2.4 TEMP 数据文件收缩
SELECT * FROM V$TABLESPACE WHERE NAME = 'TEMP';
SELECT FILE_NAME,FILE_ID,TABLESPACE_NAME,BYTES/1024/1024,AUTOEXTENSIBLE FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='TEMP';
收缩方法
SP_TRUNC_TS_FILE(
TS_ID INT ----指定截断文件的临时表空间 ID
FILE_ID INT ----指定截断文件的文件 ID
TO_SIZE INT ----指定将文件截断至多大,以 M 单位
) ----前两个字段是上述两SQL中的ID
SP_TRUNC_TS_FILE(3,0,64);
备注:修改临时表空间大小
ALTER TABLESPACE TEMP RESIZE DATAFILE 'TEMP.DBF' TO 2000;
如果表空间是自动扩展到特别大的情况下,需要通过重启数据库释放。
四、其他尝试
执行提交或回滚一下事务或者把管理工具关闭重启打开试试看,最好减少中间结果集缓存,导致内存池不足使用临时表空间,最终导致临时表空间持续暴涨。