`

解决ora-01652无法通过128(在temp表空间中)

阅读更多
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程

一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段。这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展。
分析过程:
   既然是temp表空间有问题,那当然就要从temp表空间说起啦。首先要说明的是temp表空间的作用,temp表空间主要是用作需要排序的操作。
   1.临时表空间是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)每个用户都有一个临时表空间。
   2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理。
   3.分配用户单独临时表空间,一般是针对大型产品数据库,OLTP数据库,数据库仓库对于小型产品不需要单独制定临时表空间,使用默认临时表空间。
   正常情况下,一个sql执行之后,返回结果后系统会自动收回分配给这个用户的空间。以便可以把此部分空间再分配给其他用户。
好了,既然问题出在临时表空间,那就查看一下临时表空间信息:
   select * from dba_tablespaces;
   select * from dba_temp_files;
   select * from v$tempfile
   通过观察发现,temp表空间只有一个数据文件,大小为4G,不自动扩展。大小为4G,应该说是不能算小啦。这时想到,需要看一看执行的sql语句到底是什么样的,难道它能把这个空间用完(由于系统事务非常少,所以暂不考虑其它用户语句对temp的影响),于是就把那个语句拷贝下拉,研究一番:
SELECT a.TASKID, a.EXAMTYPECODE, a.CONTROLDEPARTMENT, a.DEFAULTRECRUITSPEC, a.ISUPCUNTRYLINE,
a.ISUPCOLLEGELINE, a.ISMAYJOINRETRIAL, a.JOINRETRIALGIST, a.JOINRETRIALBAK, a.TEMPERSIGN,
a.RECRUITSTUDENTTYPE, a.MATRICULATEGIST, a.ISNOTICEEXAMINEE, a.AFTERHANDLEDEP, a.TUITION,
a.KSBH, a.BH, a.XXB, a.BMDDM, a.BMDMC,
a.BMH, a.XM, a.XMPY, a.ZJLX, a.ZJLXMC,
a.ZJHM, a.CSRQ, a.MZM, a.MZ, a.XBM,
a.XB, a.HFM, a.HF, a.ZZMMM, a.ZZMM,
a.HKSZSSM, a.HKSZSSMC, a.HKSZDXXDZ, a.CSDSSM, a.CSDSSMC,
a.CSDXXDZ, a.XXGZDW, a.TXDZ, a.YZBM, a.LXDH,
a.DZXX, a.BYNY, a.XLM, a.XL, a.XWM,
a.XW, a.KSLYM, a.KSLY, a.KSFSM, a.KSFS,
a.BKLBM, a.BKLB, a.DASZDWSSM, a.DASZDWSSMC, a.DASZDW,
a.DASZDWDZ, a.DASZDWYZBM, a.XXGZJL, a.BYXX, a.BYXX1,
a.BYXX2, a.BYXX3, a.BYXX4, a.JL, a.JTCY,
a.BYDW, a.BYDWM, a.BYZYDM, a.BYZYMC, '0'||a.DWDM DWDM,
a.DWMC, a.TJDWDM, a.TJDWMC, a.ZYDM, a.ZYMC,
a.YXSM, a.YXSMC, a.YJFXM, a.YJFX, a.DSXM,
a.ZZLLM, a.ZZLLMC, a.WGYM, a.WGYMC, a.YWK1M,
a.YWK1MC, a.YWK2M, a.YWK2MC, a.YWK3M, a.YWK3MC,
a.XYJRM, a.XYJR, a.JFBZ, a.ZXBZ, a.BMSJ,
a.BYXXBZ, a.SFZH, a.BYND, a.KSDW, a.DWSZSSM,
a.DWSZSSMC, a.ZZLL, a.WGY, a.YWK1, a.YWK2,
a.YWK3, a.ZF, (NVL(a.fscj,0)) FSCJ, a.LQLBM, a.LQLB,
a.DXWPDW, a.PG, a.PGBZ, a.BZ, a.WDDWLM,
a.WDDWL, a.JFLY, a.LQQK, a.BLDW, a.NRXNY,
a.LQND, a.BZ1, a.BZ2, a.KCH, a.KCDD,
a.ZWH,a.ZPPATH, a.XH, a.BKZYM, a.BKZY,
a.XVH,a.DY6FLAG, a.BXYWK1MC, a.BXYWK2MC, a.BXYWK3MC,
a.QKBZ1, a.QKBZ2, a.QKBZ3, a.QKBZ4, a.QKBZ5,
a.SSMZLQ, a.KSQK, a.JGM, a.JGS, a.JGSX,
a.NLDM, a.NL, a.DXZYM, a.DXZY, a.HKSZDSX,
a.DQDM, a.YDWYB, a.BRTXZ, a.GZDWZ, a.YDWLM,
a.DWLB, a.BRYB, a.BRDH, a.JTDWM, a.GL,
a.TSLB, a.TSLBM, a.XXFSM, a.XXFS, a.LQZYM,
LQZY, ZPCJ, DSXHMH1, DSXHMH2, DSXHMH3,
a.DSXHMH4, a.SZSSM, a.ZXJH, a.ZXJHBZ, a.BLZGNX,
BLZG, BLZG1, BLZBZ, JS1MC, JS1CJ,
a.JS2MC, a.JS2CJ, a.SSMZ, a.SSMZBZ, a.DXWPSSM,
a.DXWPSS, a.LQXSM, a.LQXSMC, a.LQDSM, a.LQDSXM,
a.LQYJFXM, a.LQYJFXMC, a.HANDLERESULT, a.XLZSBH, a.XWZSBH,
a.LQYJFXID, a.XXXS,nvl2(a.reexam , ROUND(GYZF),(zf * ( 1- 0.3))) GYZF,a.GYFS, a.GYCS,
b.reexam ,a.SPECIALITYNO,a.SPECIALITYNAME,
   (
   SELECT STUDENTTYPE FROM CODE_STUDENTTYPE
   WHERE STUDENTTYPECODE=A.recruitstudenttype ) STUDENTTYPE,
   (SELECT collegename FROM ENROL_COLLEGEINFO)  FSDWMC,
   (SELECT collegecode FROM ENROL_COLLEGEINFO) FSDWDM,
   (CASE WHEN a.handleresult='已录取' THEN '1' ELSE '0' END ) nlq,'' HKSZDM
FROM
( SELECT X.*, Y.SPECIALITYNO,Y.SPECIALITYNAME FROM ENROL_EXAMINEE X,   BASE_SPECIALITY Y WHERE X.DEFAULTRECRUITSPEC=Y.SPECSTANDCODE AND x.CONTROLDEPARTMENT IS NOT NULL  ) A
,(SELECT taskid,reexam FROM ENROL_EXAMINEE) b WHERE a.taskid=b.taskid
ORDER BY A.KSBH ASC
咋一看,真不赖,字段将近一百个,而且原表记录数有15000多条。所以可能真的把临时表空间吃完。于是对涉及到的基表做了一个空间占用情况统计:
SQL> set serveroutput on
SQL> exec show_space('ENROL_EXAMINEE','AUTO');
Total Blocks............................2432                                  
Total Bytes.............................19922944                              
Unused Blocks...........................0                                     
Unused Bytes............................0                                     
Last Used Ext FileId....................11                                    
Last Used Ext BlockId...................301576                                
Last Used Block.........................128                                   
计算一下基表占用19922944字节,大约是19M。还不包括其它的表的字段统计。先将temp数据文件自动扩展。先不管这个sql语句是否优化,做一个执行计划和统计分析,得到如下结果:
PLAN_TABLE_OUTPUT                                                             
----------------------------------------------------------------------------------------------------                                   
| Id  | Operation                     |  Name                       | Rows  | Bytes |TempSpc| Cost  |                                  
|   0 | SELECT STATEMENT              |                             |  9023K|  9130M|       |  3579K|                                  
|   1 |  SORT ORDER BY                |                             |  9023K|  9130M|    19G|  3579K|
|*  2 |   HASH JOIN                   |                             |  9023K|  9130M|       |   439 |                                  
|   3 |    TABLE ACCESS FULL          | ENROL_EXAMINEE              | 15146 |   310K|       |   231 |                                  
|*  4 |    TABLE ACCESS BY INDEX ROWID| ENROL_EXAMINEE              |   596 |   591K|       |     2 |                                  
|   5 |     NESTED LOOPS              |                             |  4171 |  4236K|       |   170 |        
|   6 |      TABLE ACCESS FULL        | BASE_SPECIALITY             |    84 |  2016 |       |     2 |      
|*  7 |      INDEX RANGE SCAN         | EXAMINEE_DEFAULTSPEC_INDEX  |   202 |       |       |     1 |         
PLAN_TABLE_OUTPUT                                                             
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   2 - access("SYS_ALIAS_1"."TASKID"="ENROL_EXAMINEE"."TASKID")               
   4 - filter("SYS_ALIAS_1"."CONTROLDEPARTMENT" IS NOT NULL)                  
   7 - access("SYS_ALIAS_1"."DEFAULTRECRUITSPEC"="Y"."SPECSTANDCODE")         
PLAN_TABLE_OUTPUT                                                             
--------------------------------------------------------------------------------
       filter("SYS_ALIAS_1"."DEFAULTRECRUITSPEC" IS NOT NULL)                 
                                                                              
Note: cpu costing is off                                         
由此可知,临时表空间扩展到19G。这当然会把临时表空间全部吃掉。这时应该从sql语句本身来找问题。
那个sql语句基表大约有15000,而且涉及将近100个字段,最后还有一个非常耗费资源的排序操作。去掉那个order by 查看记录的返回数。
发现返回的记录数为26950729。这对我们数据库的硬件配置来说是一个很大数量级的数据,而且字段有非常多,所以占用既定的temp表空间的之后还不停的扩展,如果没有设置自动扩展,必然导致无法分配temp段。所以那个问题的产生就是必然的啦。现在追究为什么基表只有15000多条,而查询结构却是26950729条,所以怀疑是sql语句中存在cartesian,于是开始从业务需求来分析这个语句,果然是将最后一个(SELECT taskid,reexam FROM ENROL_EXAMINEE) b 中的基表应该是enrol_task而不是enrol_examinee,因为会产生两个表同个taskid来连接,而每个taskid下有很多学生,这就导致产生了一个庞大的cartesian乘积。最终导致对26950729条记录的排序而使临时表空间用尽。(此时没有自动扩展)将b结果集中ENROL_EXAMINEE用ENROL_TASK来替换,即使还有一个排序,结果也会在很短的时间内返回。
最后需要说明的是:
    1、sql语句完成之后,需要检查记录的准确性。
    2、尽量不要在视图中进行order by ,这是一个非常耗费资源的操作。
写下拉,以存警示!

转自:http://blog.sina.com.cn/s/blog_4d9ece9a0100caw3.html
分享到:
评论

相关推荐

    ORA-01654处理表空间不足问题.pdf

    ORA-01654处理表空间不足问题 Oracle 数据库中,表空间不足是非常常见的...解决ORA-01654处理表空间不足问题需要通过查看表空间使用情况、查看表空间自动扩展功能、扩大原表空间大小或增加新的数据文件等方法来实现。

    Oracle数据库发生ORA-04031错误原因浅析及处理.pdf

    但是在实际应用过程中经常会出现“ORACLE 的 JOB 无法执行”、“ORA-04031”等错误情况,给维护及使用带来问题。 ORA-04031错误信息产生的原因主要有两种情况: 1. Oracle进程在向SGA申请内存时,如果申请失败,将...

    Oracle 如何解决 ORA-01187:无法从文件中读取

    "Oracle 解决 ORA-01187:无法从文件中读取" Oracle 是一个功能强大的关系数据库管理系统,但是在实际应用中,我们可能会遇到各种错误信息,例如 ORA-01187:无法从文件中读取。该错误信息通常是由于临时文件无法被...

    oracle+ora-各种常见java.sq

    - `java.sql.SQLException: ORA-01652: unable to extend temp segment by X in tablespace TEMP`: 临时表空间不足。增加临时表空间大小或优化使用临时表空间的查询。 以上是Oracle数据库操作中常见的`java.sql....

    oracle数据库操作常见错误以及解决方案

    其次,错误`ORA-01652: unable to extend temp segment by num in tablespace name`是由于临时表空间不足造成的。临时表空间主要用于存储排序和临时结果。当Oracle无法在当前临时表空间找到连续的空间来扩展临时段时...

    ORACLE修改表空间大小

    其中一种常见问题是ORA-01652错误,即“无法在指定表空间扩展临时段”。这通常发生在对临时表空间的操作上。当Oracle数据库执行涉及排序、连接等操作时,会使用临时表空间来存储临时数据。如果这些操作所需的空间...

    Oracle常见错误代码的分析与解决

    这个错误意味着回滚段在指定的表空间中无法扩展,通常是由于执行大规模的数据操作导致现有的回滚段不足以存储这些操作的回滚信息。回滚段是事务管理的关键组成部分,用于撤销未完成的事务。 **解决方式**: 1. ...

    Oracle导dmp出现文件ORA-12154 TNS 无法解析指定的连接标识符解决方案

    ### Oracle导dmp出现文件ORA-12154 TNS 无法解析指定的连接...通过以上步骤,可以有效地解决ORA-12154错误,并顺利完成Oracle数据库的导入导出操作。这些方法不仅适用于特定的场景,还能够作为常规故障排查的参考指南。

    Oracle数据库操作常见错误及解决方案

    本文将深入解析两个常见的Oracle错误及其解决方案:ORA-01650和ORA-01652,并提供相关的排查和解决策略。 **ORA-01650: unable to extend rollback segment NAME by NUM in tablespace NAME** 这个错误表明回滚段...

    orcale错误代码

    6. ORA-01636到ORA-01652: 这些错误涉及到回退段的使用情况,如回退段已联机、被其他进程使用、无法扩展等。这可能需要检查数据库的资源管理策略,包括回退段的数量、大小和分配策略。 7. 其他错误如ORA-01630至ORA...

    Oracle_Errors描述

    5. **ORA-01652: unable to extend temp segment by 128 in tablespace TEMP** 当临时表空间不足以存储临时数据时,会出现这个错误。解决方式是增大临时表空间大小,或者调整SQL语句以减少临时空间的需求。 6. **...

    Oracle释放临时表空间脚本

    在Oracle数据库管理中,临时表空间(Temporary Tablespace)的管理是一项非常重要的任务。合理的管理和优化临时表空间不仅可以提高系统的性能,还可以帮助解决空间不足等问题。本文将详细介绍如何通过SQL脚本进行...

    oracle常见错误解析

    5. ORA-01652: 无法在temp表空间扩展 当临时表空间不足以完成操作,如排序或连接,就会出现这个错误。增加临时表空间的大小,或者分配更多的临时段,可以解决这个问题。 6. ORA-01722: 无效数字 这个错误表示在尝试...

    如何解决Oracle8i数据库临时表空间满的问题.pdf

    4. Oracle临时表空间满的问题:当临时表空间的磁盘空间被全部占用后,可能会出现错误消息,例如“ORA-1652: unable to extend temp segment by %s in tablespace %s”。这会导致用户无法完成如排序、并行查询等操作...

    oracle常用命令及错误类型(error message)

    10. ORA-01652:无法在临时表空间扩展 - 解决:增大临时表空间的大小,或调整SQL语句以减少排序需求。 学习Oracle命令和理解错误类型是掌握Oracle数据库管理的关键步骤。通过实践这些命令和解决常见错误,可以提高...

    ORACLE常见错误代码的分析与解决

    当Oracle数据库在执行排序操作或其他需要临时空间的操作时,如果临时表空间中没有足够的空间来扩展临时段,则会抛出ORA-01652错误。 **原因分析:** 1. **临时表空间空间不足:** 如果临时表空间的总容量不足以...

    操作系统崩溃,数据库全部文件都在时,数据库恢复方法.pdf

    除了数据文件(如`.DBF`)、控制文件(如`.CTL`)、日志文件(如`.LOG`)外,还应考虑重做日志文件、回滚段文件(Undo `.DBF`)以及临时表空间文件(Temp `.DBF`)。此外,用户提到可能丢失了部分索引文件(如`INDEX...

    Oracle导dmp出现文件ORA-12154: TNS: 无法解析指定的连接标识符问题的解决方案

    在使用Oracle数据库进行数据导入导出操作时,常常会遇到ORA-12154错误,即TNS:无法解析指定的连接标识符。这个问题主要由两个原因造成:一是Oracle服务器未安装正确,二是TNS配置文件未正确设置。以下是针对这两种...

    oracle常见错误精集

    ##### ORA-01652: unable to extend temp segment by num in tablespace name **产生原因**: ORACLE临时段表空间不足。这是因为ORACLE总是尽量分配足够的临时空间给临时段使用,但在某些情况下,可能会导致临时段表...

    oracle常见错误代码的分析与解决.doc

    其次,错误代码ORA-01652表示"unable to extend temp segment by num in tablespace name",意味着Oracle在尝试扩展临时段时遇到了表空间不足的问题。临时段主要用于存储排序和临时结果集,当无法分配连续空间时会...

Global site tag (gtag.js) - Google Analytics