首页 / 数据库 / MySQL / ORA-1652: unable to extend temp segment by 8192 in tablespace XXX
用户在运行以下语句时报ORA-1652Insert into TMP_FACT_XX01
( CONTNO, POLNO, MAINPOLYEAR ) SELECT /*+parallel(a, 8)*/ MAX(CONTNO), POLNO, MAINPOLYEAR FROM FACT_XX01 a GROUP BY POLNO, MAINPOLYEAR; 报错信息如下:ORA-1652: unable to extend temp segment by 128 in tablespace XXX01 注意这里的XXX01是FACT_XX01所在表空间,并非temp表空间,所以这里的ORA-1652并非是group by引起,而且在进行insert into ... select ... 时需要在insert into的表空间中产生一个临时段用于存储select查询产生的结果集,待语句执行结束后,这个临时段会变成永久段,就是insert into的表段。会产生这种临时段的操作还很多,例如:create index、create pk constraint、enable constraint、CATS等。 下面查看下XXX01表空间free空间大小:select sum(bytes)/1024/1024/1024 from dba_free_space where tablespace_name = "XXX01"; SUM(BYTES)/1024/1024/1024
108.329162597656
FACT_XX01表大小为23.53GB,所以XXX01表空间是足以放下上述sql中select部分产生的结果集的,因为sql中还有group by,最后的结果集肯定小于23.53GB,但是为什么还会报上面的错误? 这里要注意,上面的查询只是看总的剩余空间是否足够,但是表空间是会存在碎片的,也就是说上面看到的free空间可能是由很多不连续的空间组成的,而这里的临时段需要连续的空间,接下来再观察表空间中最大的连续free空间:select max(bytes)/1024/1024/1024 from dba_free_space where tablespace_name="XXX01";