当前位置:  数据库>oracle

ORA-1652: unable to extend temp segment by 8192 in tablespace XXX

    来源: 互联网  发布时间:2017-06-18

    本文导语: 用户在运行以下语句时报ORA-1652 Insert 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

Insert 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';
 
MAX(BYTES)/1024/1024/1024

3.875

    这里最大的连续free空间只有3.875GB,所以不足以放下上述报错sql的select结果集,导致出现ORA-1652。
 所以,要解决这个错误,可以整理表空间碎片,也可以为表空间增加新的空间。 另外,表空间的碎片情况,可以用下面的语句进行查询:

select
 
  total.tablespace_name tsname,

  count(free.bytes) nfrags,

  nvl(max(free.bytes)/1024,0) mxfrag,

  total.bytes/1024 totsiz,

  nvl(sum(free.bytes)/1024,0) avasiz,

  (1-nvl(sum(free.bytes),0)/total.bytes)*100 pctusd

from

  dba_data_files total,

  dba_free_space free

where

  total.tablespace_name = free.tablespace_name(+)

  and total.file_id=free.file_id(+)

group by

  total.tablespace_name,

  total.bytes

/
    后记:当然,一开始的insert into ... select ...语句是有问题的,用户的本意是使用并行提高速度,但是语句只在select部分开启了并行,insert部分没有开启并行,而且DML的并行是需要单独设置,不能光使用hint。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 出现ORA-01401和ORA-01008错误?
  • Eclipse连接Oracle数据库的ORA-00604 ORA-12705错误
  • oracle ORA-01114、ORA-27067错误解决方法
  • Oracle不能删除表 ORA-00604 ORA-01422 错误
  • 如何得到带有ora的行的下一行
  • ORA-12514及ORA-28547错误解决方案
  • 如何配置 linux 下 oracle 的 listener .ora 和
  • 浅析如何在tnsnames.ora中配置监听
  • Orcle的package中访问其它Schema的表报错ORA-00942解决方法
  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法
  • [Oracle] 浅析令人抓狂的ORA-01555问题
  • 解决报错ora-32035的方法分析
  • aq.executeQuery: ORA-00020: maximum number of processes (59) exceeded
  • Oracle 数据库闪回功能设置出现ORA-19809和ORA-19804错误
  • ORA-00947:Not enough values (没有足够的值)的深入分析
  • solaris10 安装 ora9.2.0.1 时报错
  • 在UNIX下,我的ORA817该怎么样才可以自己启动呀?
  • 基于ORA-12170 TNS 连接超时解决办法详解
  • plsql连接oracle数据库报ora 12154错误解决方法
  • 安装oracle出现error:ora-01031:insufficient privilleges的解决


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3