FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展

时间:2022-05-22 12:28:19

一、出现如下两个错误:
1.某一段SQL语句执行时间超过1个小时;
2.一个小时后,提示如下错误:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展 temp 段ORA-06512: 在 "STG.FP_MO2SAP"

二、检查及处理过程
提示temp表空间有问题,临时表空间主要是用于在排序操作或者大型查询、统计分析操作。
1.先检查临时表空间信息 select * from dba_tablespaces; select * from dba_temp_files; select * from v$tempfile
检查发现临时表空间有32G,当前只执行此语句就把整个表空间用完,初步估计SQL语句有问题,可将语句拷贝出来研究。
如下图是释放后结果图:

FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展
2.对SQL语句进行优化,加索引,再次执行语句时间由一个小时变成6秒,成功一半。

CREATE INDEX STG.IDX_TEMP_MO_DBA01 ON STG.TEMP_MO(LOC_ID,ITEM)
LOGGING
TABLESPACE WWFDATA
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL; CREATE INDEX STG.IDX_IN_ITEM_SITE_DBA01 ON STG.IN_ITEM_SITE(ITEM_ID,PROC_TYPE)
LOGGING
TABLESPACE WWFDATA
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL; CREATE INDEX STG.IDX_IN_ITEMBOMROUTING_DBA01 ON STG.IN_ITEMBOMROUTING(PRODUCED_ITEM_ID,SITEID)
LOGGING
TABLESPACE WWFDATA
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL;

3.将此SQL语句加回存储过程FP_MO2SAP后还是比较慢,再继续检查SQL语句。

select count(1) from IN_ITEMBOMROUTING --193027
select count(1) from temp_mo --
set serveroutput on
exec show_space('IN_ITEMBOMROUTING');

表记录数有19W条。有可能会把临时表空间吃完,对涉及到的基表做了一个空间占用情况统计,计算一下基表占用19922944字节,大约是19M。还不包括其它的表的字段统计,

FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展

4.接下来做一个执行计划和统计分析,得到如下结果:

FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展

发现SQL语句里面没有用到temp_mo表