oracle 9i 临时表空间的问题

oracle 9i 临时表空间的问题正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉仍没有解决问题。

这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。

法一、重启库库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所法二、Metalink给出的一个方法修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

SQL>alter tablespace temp increase 1;SQL>alter tablespace temp increase 0;法三、我常用的一个方法,具体内容如下:1、使用如下语句a查看一下认谁在用临时段SELECT * FROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr2、那些正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法1、确定TEMP表空间的ts#SQL>select ts#, name from sys.ts$ ;TS# NAME-----------------------0 SYSYEM1 RBS2 USERS3* TEMP4 TOOLS5 INDX6 DRSYS2、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;说明:temp表空间的TS# 为 3*, So TS#+ 1= 4其它:1、出现如上问题的原因我认为可能是由于大的排序超出了TEMP表空间的空间允许范围引起的。

也可能包含着2、观注TEMP等这些空间的状态是Dba日常职责之一,我们可以通过Toad、Object Browser等这些工具办到,SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比",F.TOTAL_BYTES "空闲空间(M)",F.MAX_BYTES "最大块(M)"FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME) F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME) DWHERE D.TABLESPACE_NAME = F.TABLESPACE_NAMEORDER BY 4 DESCOracle9i引入了全局缺省临时表空间,缺省的如果不指定用户临时表空间,Oracle会为用户指定这个缺省临时表首先查询用户的缺省临时表空间:[oracle@jumper oracle]$ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.4.0 - Production on Wed Apr 12 11:11:43 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - ProductionSQL> select username,temporary_tablespace from dba_users;USERNAME TEMPORARY_TABLESPACE------------------------------ ------------------------------SYS TEMP2SYSTEM TEMP2OUTLN TEMP2EYGLE TEMP2CSMIG TEMP2TEST TEMP2REPADMIN TEMP2......13 rows selected.SQL> select name from v$tempfile;NAME---------------------------------------------------------------------/opt/oracle/oradata/conner/temp02.dbf/opt/oracle/oradata/conner/temp03.dbf重建新的临时表空间并进行切换:SQL> create temporary tablespace temp tempfile '/opt/oracle/oradata/conner/temp1.dbf' size 10M; Tablespace created.SQL> alter tablespace temp add tempfile '/opt/oracle/oradata/conner/temp2.dbf' size 20M;Tablespace altered.SQL> alter database default temporary tablespace temp;Database altered.SQL> select username,temporary_tablespace from dba_users;USERNAME TEMPORARY_TABLESPACE------------------------------ ------------------------------SYS TEMPSYSTEM TEMPOUTLN TEMPEYGLE TEMPCSMIG TEMPTEST TEMPREPADMIN TEMP.......13 rows selected.如果原临时表空间无用户使用,我们可以删除该表空间:SQL> drop tablespace temp2;Tablespace dropped.SQL>SQL> select name from v$tempfile;NAME---------------------------------------------------------------/opt/oracle/oradata/conner/temp1.dbf/opt/oracle/oradata/conner/temp2.dbfSQL> select file_name,tablespace_name,bytes/1024/1024 MB,autoextensible2 from dba_temp_files3 /FILE_NAME TABLESPACE_NAME MB AUTOEXTENSIBLE -------------------------------------- -------------------- ---------- -------------- /opt/oracle/oradata/conner/temp2.dbf TEMP 20 NO/opt/oracle/oradata/conner/temp1.dbf TEMP 10 NO我们知道Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。

像上文提到的恐怖现象经过分析可能是以下几个方面的原因造成的。

1. 没有为临时表空间设置上限,而是允许无限增长。

但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。

2.查询的时候连表查询中使用的表过多造成的。

我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。

3.对查询的某些字段没有建立索引。

Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间而如果有索引的话,一般只是将索引的数据复制到临时表空间中。

参照以上原因尝试解决下,如果不行就清空临时表空间,不过还是建议先查找临时表空间增长的原因才是关键清控临时表空间1.startup --启动数据库2.create temporary tablespace TEMP2 TEMPFILE '/home2/oracle/oradata/sysmon/temp 创建中转临时表空间3.alter database default temporary tablespace temp2;--改变缺省临时表空间为刚4.drop tablespace temp including contents and datafiles;--删除原来临时表空间5.create temporary tablespace TEMP TEMPFILE '/home2/oracle/oradata/sysmon/temp0重新创建临时表空间6.alter database default temporary tablespace temp;--重置缺省临时表空间为新建的7.drop tablespace temp2 including contents and datafiles;--删除中转用临时表空8.alter user roll temporary tablespace temp; --重新指定用户表空间为重建的临时。

合集下载

temp 临时表空间不释放

temp 临时表空间不释放

如果您遇到了Oracle数据库中temp表空间不释放的问题,这可能是由于多种原因造成的。

以下是一些建议和步骤,帮助您解决这个问题:1. **识别问题**:首先,确认确实有临时空间没有被释放。

您可以通过查询`DBA_TEMP_FREE_SPACE`视图来查看可用的临时空间。

```sqlSELECT * FROM DBA_TEMP_FREE_SPACE WHERE TABLESPACE_NAME = 'TEMP';```2. **会话级别的临时表空间使用**:如果您知道是哪个会话或进程在使用这些临时空间,您可以考虑直接在那个会话中结束其使用,例如通过断开连接或结束进程。

3. **清除旧的临时段**:Oracle会自动清除临时段,但有时由于某种原因(如错误的段策略配置)这可能不会发生。

您可能需要手动清理这些旧的临时段。

但在此之前,请确保先备份数据库。

对于AIX或HP-UX系统:1. 使用`alter system`命令,将`undo_management`设置为`manual`。

2. 执行`drop tablespace temp including contents;`。

3. 重新创建临时表空间。

4. 将`undo_management`重新设置为`auto`。

5. 执行`alter system flush temp_undo_tablespace;`。

对于Linux系统:1. 使用`alter system`命令,将`undo_management`设置为`manual`。

2. 执行`drop tablespace temp including contents;`。

3. 重新创建临时表空间。

4. 将`undo_management`重新设置为`auto`。

5. 执行`alter system flush temp_undo_tablespace;`。

6. 如果上述步骤没有解决问题,您可能需要考虑手动清理文件系统上的临时文件或与操作系统管理员联系,以确保文件系统空间被正确释放。

oracle修改表空间大小的方法

oracle修改表空间大小的方法

oracle修改表空间大小的方法一、引言Oracle数据库是广泛应用于企业级应用系统的数据库管理系统,表空间是Oracle数据库中最基本的数据存储单位。

为了满足业务需求或应对数据增长,常常需要对表空间的大小进行调整。

本篇文章将详细介绍如何修改Oracle数据库中的表空间大小。

二、准备工作1. 确认具有足够的权限:修改表空间大小需要具有足够的权限,通常需要具有DBA(数据库管理员)角色或与之相关的权限。

2. 了解表空间状态:在修改表空间大小之前,需要确保表空间处于正确的状态,例如是否打开了,是否是只读状态等。

3. 备份数据:修改表空间大小可能会对数据库中的数据产生影响,因此在执行此操作之前,强烈建议进行数据备份。

1. 使用ALTER TABLESPACE命令:使用ALTER TABLESPACE命令可以动态地增加或减少表空间中的存储空间。

以下是基本语法:```sqlALTER TABLESPACE tablespace_name ADD SPACE[ ( space_number ) ] [ DATAFILE 'file_path' [ SIZE{ file_size | next_autoextend } ] ] ;```* `tablespace_name`:要修改的表空间名称。

* `space_number`:要添加的空间编号(可选)。

* `file_path`:新数据文件的路径和文件名。

* `file_size`:新数据文件的大小(可选)。

* `next_autoextend`:自动扩展的最小大小(可选)。

2. 使用ALTER TABLE命令:通过修改表的数据块大小来间接调整表空间的大小。

这种方法适用于调整单个表的大小。

以下是基本语法:```sqlALTER TABLE table_name MODIFY (data_block_size =new_size);```* `table_name`:要修改的表的名称。

Oracle临时表空间满的处理步骤

Oracle临时表空间满的处理步骤

Oracle临时表空间主要用来做查询和存放一些缓冲区数据。

临时表空间消耗的主要原因是需要对查询的中间结果进行排序。

重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp 表空间会一直增长。

直到耗尽硬盘空间。

临时表空间不足,会产生如下报错:网上有人猜测在磁盘空间的分配上,oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB。

也就是说当前临时表空间文件的大小是历史上使用临时表空间最大的大小。

临时表空间的主要作用:索引create或rebuildOrder by 或 group byDistinct 操作Union 或 intersect 或 minusSort-merge joinsanalyze清除临时表空间的方法治标不治本从根本上降低temp表空间的膨胀的方法有2个:1 设置合理的pga或sort_area_size2 优化引起disk sort的sql清除并重建临时表空间的步骤:0.shutdown immediate;1.startup --启动数据库2.create temporary tablespace TEMP2 TEMPFILE'E:/oracle/oradata/battery/temp02.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --创建中转临时表空间3.alter database default temporary tablespace temp2;--改变缺省临时表空间为刚刚创建的新临时表空间temp24.drop tablespace temp including contents and datafiles;--删除原来临时表空间5. create temporary tablespace TEMP TEMPFILE 'E:/oracle/oradata/battery/temp.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --重新创建临时表空间6.alter database default temporary tablespace temp;--重置缺省临时表空间为新建的temp表空间7.drop tablespace temp2 including contents and datafiles;--删除中转用临时表空间8.alter user backwardsys temporary tablespace temp; --重新指定用户表空间(用户名)为重建的临时表空间9.可通过语句select username,default_tablespace,temporary_tablespace from dba_users 来查询数据库用户的临时表空间。

处理临时表空间满的一些方法

处理临时表空间满的一些方法

处理临时表空间满的一些方法如何处理Oracle中TEMP表空间满的问题(转载)正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段a的。

但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。

这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。

法一、重启库库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。

法二、Metalink给出的一个方法修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

SQL>alter tablespace temp default storage(pctincrease 1) ;SQL>alter tablespace temp default storage(pctincrease 1) ;法三、我常用的一个方法,具体内容如下:1、使用如下语句a查看一下认谁在用临时段SELECT username,sid,serial#,sql_address,machine,program,tablespace,segtype,contentsFROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr2、那些正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法1、确定TEMP表空间的ts#SQL>select ts#, name from sys.ts$ ;TS# NAME-----------------------0 SYSYEM1 RBS2 USERS3* TEMP4 TOOLS5 INDX6 DRSYS2、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;说明:temp表空间的TS# 为3*, So TS#+ 1= 4其它:1、出现如上问题的原因我认为可能是由于大的排序超出了TEMP表空间的空间允许范围引起的。

Oracle临时表空间清理

Oracle临时表空间清理

Oracle 临时表空间清理回收
Oracle临时表空间使用时,一旦空间自动扩展,已扩展的大小是不能收缩的,除非重建临时表空间。

正常来说临时表空间中非活动段是由后台smon进程自动释放的,但smon进程每两个小时五分钟才进行一次临时段的回收清理,且每次清理只会回收五个临时段,因此如果连接排序等操作过于频繁时,会导致临时表空间扩展,当然这跟配置的Oracle物理内存也有关系,主要是PGA区,如果配置的内存过少,大量的排序在内存中无法完成,将会额外使用临时表空间来完成,因此临时表空间消耗与配置了大PGA内存相比必然多出。

频繁复杂的语句连接排序完全可能导致临时表空间不停扩展,临时段来不及回收,出现无临时段可用的情况。

如果临时段不能及时释放,通常可以通过重启数据库来清理非活动的临时段,实践证明没有问题。

但如果生产环境不适宜重启数据库,也可以使用手工方式进行非活动临时段的清理。

Oracle 9i OEM中经常看到临时表空间满,其实那是假象,因为OEM是从v$temp_extent_pool统计的。

正常来说要看v$sort_segment中sum(free_blocks)是不是近于0,以确认临时表空间是不是真的满了,如果为0,则表明临时表空间已被当前激活临时段用完。

手工清理非活动临时段的方法如下:
1、正常退出、终止所有连接数据库的应用
5、执行临时表空间非激活临时段清理
该方法适用于Oracle9i以上版本。

Oracle_表空间的过大处理方法

Oracle_表空间的过大处理方法

--临时表空间满时的处理方法1.增加临时文件: 不建议设置为自增长导致把磁盘给撑满SQL> ALTER TABLESPACE TEMP ADD TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'SIZEE 10M AUTOEXTEND OFF;2.修改临时文件: 可以将原来的数据文件改大一点如:SQL> ALTER DATABASE TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'RESIZE100M;3.收缩Shrinking临时表空间SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP20M; 收缩表空间SQL> ALTER TABLESPACE temp SHRINK TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'; 收缩文件数据库重启后,会自动释放temp表空间默认临时表空间TEMP的过大的重建流程如果删除不了查询哪些sql在使用临时表空间,开启另外一个session查询SQL> selectername,se.sid,se.serial#,su.extents,su.blocks*to_number(rtrim(p.value))as space,tablespace,segtype,sql_text from v$sort_usage su,v$parameter p,v$sessionse,v$sql s where ='db_block_size'and su.session_addr=se.saddr ands.hash_value=su.sqlhash and s.address=su.sqladdr order by ername,se.sid;如果列出存在的,则通过以下语句杀掉这些sid与serial 【注意:1是系统进程不能乱杀】SQL> alter system kill session'187,12619';SYSTEM与SYSAUX表空间满了怎么办?1.添加表空间2.把system或者sysaux表空间的信息迁移到其它表空间。

Oracle10g的临时表空间占满之后的解决方法。

Oracle10g的临时表空间占满之后的解决方法。

公司客户数据库用了一段时间之后,总是出现磁盘被占满的情况。

基本上这个情况要么就是undo表空间很大,要么就是临时表空间很大,这个时候就需要进行转储undo表空间或者临时表空间。

以下是解决方法。

---解决临时表空间Temp的方法TEMP文件尚未调整,还是16G,首先创建了一个新的TEMP文件并设定为缺省临时表空间SQL> create temporary tablespace TEMP3 TEMPFILE '/opt/oracle/oradata/cuss/TEMP2.dbf' size 20m reuse autoextend off;SQL>alter database default temporary tablespace "TEMP2"结果这个情况下做exp产生ORA-01403的错误,后来得知是因为TEMP临时表空间容量过小的原因重新创建一个TEMP3文件,初始大小1G,每次增长200M,最大限制为4G。

SQL> create temporary tablespace TEMP3 TEMPFILE'/opt/oracle/oradata/cuss/TEMP3.dbf' size 1000m reuse autoextend on next 200m maxsize 4000m;把缺省临时表空间指向这个新建的TEMP3。

SQL>alter database default temporary tablespace "TEMP3"删除原有的临时表空间文件和操作系统中的对应物理文件,释放磁盘空间SQL>drop tablespace temp2 including contents and datafiles;重新做exp导出,导出成功。

至此调整结束。

oracle中临时表用法

在Oracle 数据库中,临时表(Temporary Table)是一种在会话期间存在并可用的表,这种表在会话结束时自动删除。

临时表的主要作用是为了解决数据管理的问题及优化查询性能,可以大大减少数据的I/O 操作,提高查询的速度。

临时表提供了一个临时存储结果集的空间,在某些情况下,创建一个临时表来存储查询的结果集,可能要比多次进行复杂的连接查询更为高效。

常见的用法包括但不限于以下几种:1. 存储及处理大型数据集:对于数据存放不方便的情况,使用临时表可以提高查询速度并且减少与外部程序的交互。

2. 存储查询的中间结果:当多个表连接查询时,查询的结果可能是复杂的中间结果,此时可以使用临时表存储结果,以便后续的查询操作,这可以大大提高查询效率。

3. 缓存查询结果:将查询结果存储到临时表中,在下一次查询时可以直接从临时表中获取数据而不需要再次执行查询,减少了查询的时间。

在Oracle 中创建临时表的语法如下所示:```CREATE GLOBAL TEMPORARY TABLE 表名(列名数据类型,...)ON COMMIT {DELETE|PRESERVE} ROWS;```创建临时表的时候需要设置ON COMMIT 子句。

DELETE 这个选项表示当事务提交后删除临时表中所有的数据。

PRESERVE 这个选项则表示当事务提交后保留临时表中的数据。

使用GLOBAL 关键字创建的是全局临时表,可以被其他会话访问;如果使用的是SESSION 关键字,则创建的是会话级别的临时表,只能被当前会话访问。

临时表在使用结束之后,需要使用DROP TABLE 命令来删除。

例如:```DROP TABLE 表名;```需要注意的是,临时表的作用是暂时存储数据,使用后需要及时删除,否则可能会浪费存储空间和影响其他查询。

Oracle临时表空间不足和批处理缓慢问题探讨

Oracle临时表空间不足和批处理缓慢问题探讨谭红斌【摘要】数据库系统出现问题时,会导致整个系统不稳定.文章分析了Orcale临时表空间不足和批量处理时运行速度缓慢的原因,并给出了解决办法.【期刊名称】《天中学刊》【年(卷),期】2012(027)002【总页数】3页(P36-38)【关键词】SQL;hash;join;临时表空间【作者】谭红斌【作者单位】驻马店职业技术学院,河南驻马店463000【正文语种】中文【中图分类】TP392笔者所在学院的学生管理系统后台使用的是Oracle数据库.在每天凌晨批处理期间,ALERT日志频繁报出临时表空间不足的告警信息,导致批量程序运行失败.在对临时表空间进行多次扩容后(从40 GB增加到 60 GB,再增加到 100 GB),问题仍然无法有效地解决.即使在批量执行成功的时候,也需要执行很长时间才能完成.为了解决此问题,急需对该问题进行全面排查,以找到解决办法.根据以往的经验,笔者分析认为造成这一问题的原因可能是服务器硬件存在性能问题、操作系统设置有问题或者是应用本身的 SQL语句编写有问题.为此,笔者衡量服务器的运算能力以及该数据库的负载,使用测试工具测试,并未发现服务器及Oracle本身的瓶颈问题.因此,把问题定位在应用逻辑方面,并做了如下详细的测试.查看数据库 AWR报告,发现该报告未能准确体现出占用临时表空间最高的SQL 语句.为此,笔者编写了一个记录使用临时表空间SQL语句的shell脚本,用来记录使用临时表空间最高的SQL语句,并将其保存在特定的表中.该脚本的部分SQL语句编写如下:在临时表空间已增加到 100 GB的情况下,重新进行批量运行,出现临时表空间不足错误时,笔者根据编写的监控脚本,顺利抓取到了最消耗临时表空间的两个语句.其中,语句1消耗约40 GB临时表空间,语句2消耗约60 GB临时表空间.由于语句1和语句2的语法结构完全一致,只是批量处理的数据不一样,故这两个语句可用同一语句描述,具体如下:分析语句发现,执行计划使用了hash join连接技术,当驱动表无法在内存中装载时,驱动表一次或多次被置换到临时表空间,发生one-pass或muti-pass的现象,导致临时表空间的消耗和执行效率的低下.由于语句1和2结构完全一致,因此对语句1分析和优化即可,根据监控脚本所抓取到的SQL语句及其id,我们得到了如图1所示的执行计划信息.由图1可以看出,该执行计划的问题在于出现了“merge join cartesian”合并连接笛卡尔乘积,而其乘积结果作哈希连接的驱动表.由于PGA(程序全局区)中的hash area无法完全装载该表,导致出现one-pass、muti-pass,大量占用临时表空间,程序运行效率低下.该合并连接笛卡尔乘积将产生约1 700万条记录,而PGA大小为 1 628 M,hash area最多能使用 1628*5% = 80 M,显然80 M的hash area无法装载更多记录的运算结果,继而大量占用临时表空间,导致程序运行效率低下.SQL优化器CBO之所以选择合并连接笛卡尔乘积,原因在于CBO评估合并连接笛卡尔乘积返回的结果为1行,检查设置该语句的三个分区表的统计信息,发现统计信息为0行.至此,问题已经清楚.由于批量的流程为数据加载、运算、数据全删除.因此系统自动统计信息时往往在批量数据全部删除后进行,导致采集的统计信息的为0行,继而CBO选择了合并连接笛卡尔乘积,导致了错误的执行计划、大量的临时表空间占用和性能低下的执行计划.根据每个系统每日数据并不大的情况,理想的执行计划应为:子查询中的D表和E表做hash join,所产生的结果集做为另外一个hash join的probe表去探测A 表.将复合记录的结果返回.由此,子查询不应该做view merge.我们将语句改写,限制数据库CBO优化器做出错误的执行计划选择.语句重写后,在很短时间内即可完成,同时,未出现对临时表空间的消耗现象.以下为修改后语句的部分内容,其执行计划为笔者所预期的理想路径,执行计划信息如图2所示.语句在修改前在执行时间超过 1个小时仍未结束,而经过语句重写后,测试显示不到1分钟即可完成,同时也消除了对临时表空间的过量消耗的问题.根据以上分析,笔者认为要提高SQL语句的编写效率,简化SQL的处理逻辑,在应用编写时应考虑到表的增量以及相应的执行计划,在关键SQL语句中使用显式执行计划.系统关键SQL语句应考虑:(1) 使用 hint稳定执行计划,通过在子查询中加入no_merge的hint防止CBO 优化器做view merge.同时,由于子查询内部的谓词中已有分区键,且CBO可有效使用分区去除,故通过加入no_index的hint可使对单个分区扫描的索引范围更加有效.(2) 基于批量处理的流程,可在调用批量程序运行的shell脚本,数据加载完毕,并对相关的三张表进行统计信息的收集之后,再开始做merge的批量操作.【相关文献】[1] 滕永昌.Oracle数据库系统管理[M].北京:清华大学出版社,2003:80―96.[2] 郑阿奇.ORACLE实用教程[M].北京:电子工业出版社,2009:120―160.[3] 文平.ORACLE大型数据库系统在AIX\UNIX上的实战详解[M].北京:电子工业出版社,2010:66.[4] 王彬.Oracle IIg基础与提高[M].北京:电子工业出版社,2009:230―261.[5] 肖平.基于Oracle应用服务器的Web开发技术[M].北京:清华大学出版社,2010:90.。

深入浅出谈Oracle临时表


关于临时表上的DML活动,有以下结论: 活动,有以下结论: 关于临时表上的 活动
• 1、 INSERT 会生成很少甚至不生成undo/redo活动。因此,临 时表对insert/select型的应用很有用。 比如在处理web翻页时, 可以通过临时表来模拟cache返回结果。 • 2、 DELETE 在临时表上生成的redo与正常表上生成的redo同 样多。 • 3 、临时表的UPDATE会生成正常表UPDATE一半的redo。
在一个SESSION中(比如SQLPLUS登陆)插入上面3条记录,然后再以另外一个SESSION(用 SQLPLUS再登陆一次)登陆,当你select * from classes;的时候,classes表是空的,而你再第 一次登陆的SQLPLUS中select的时候可以查询到,这个时候你没有进行commit或者rollback之前 你可以对刚才插入的3条记录进行update、delete等操作,当你进行commit或者rollback的时候, 这个时候由于你的表是事务级的临时表,那么在插入数据的session也看不到数据了,这个时候 数据就已经被截断了。
什么时候使用临时表? 什么时候使用临时表?
• 1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表 关联。可以采用将大表进行分拆并且得到比较小的结果集合存放 在临时表中。 • 2)、程序执行过程中可能需要存放一些临时的数据,这些数据在 整个程序的会话过程中都需要用的等等。
<Insert Picture Here>
事务级SQL操作 操作 事务级
• • • • • • • • • • SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(1,'计算机','9608'); 1 row inserted SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(2,'经济信息','9602'); 1 row inserted SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(3,'经济信息','9603'); 1 row inserted SQL> update classes set class_memo ='' where class_id=3 ; 1 row updated SQL> select * from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------1 计算机 9608 2 经济信息 9602 3 经济信息 SQL> delete from classes where class_id=3 ; 1 row deleted SQL> select * from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------1 计算机 9608 2 经济信息 9602 SQL> commit; Commit complete SQL> select *from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------SQL> 再重复插入一次,然后rollback。 SQL> Rollback ; Rollback complete SQL> select * from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------SQL>
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档