Oracle临时表的应用问题

网上有人给出了最佳的优化思路是:

1.先将大表中满足条件的记录抽出来生成一张临时表.

2.再将这较小的临时表与另一张较小的表进行关联查询.

先不论思路是否值得商榷,这把临时表当成中转站的做法还是很值得肯定

临时表本质上就是一种cache的表现形式,Oracle的临时表都是事先建好的

一旦用了临时表,存放的就是和本会话相关的数据

没有人会傻乎乎地用临时表来保存本应该共享的数据

with子查询实际上也是用了临时表,Oracle会替你创建一张临时表

因此临时表的开销WITH子查询也会有。只要把AUTOTRACE打开你就会看到REDO的开销

关于临时表的使用至少会带来两个问题:

1)主查询的执行计划问题

2)额外的写redo的问题

如果,

临时表作为复杂查询条件的中间结果用于主查询,因为临时表里往往只是个别字段的少量数据,1)的问题比较突出;

如果,

临时表作为最终展现前的结果归集,可能临时表会有比较多字段的较多数据,2)的问题比较突出

㈠ 主查询的执行计划问题

9i临时表由于动态采样level 1,还得用hint,10g比较好用

比较复杂的存储过程(比如数据抽取)可能用到临时表,比实体表优势就是redo少,自动清除

对于临时表的缺陷--采样问题,执行计划的问题其实主要是临时表的cardinality的问题

对于临时表方案,建议动态采样。9IR2以后的版本使用DYNAMIC_SAMPLING 参数或hint能基本避免

如写上 HINT强制它采样 /*+dynamic_sampling(t 0) */

cardinality hint分段提示是个比较好的最佳实践

例如:

临时表里的数据量有大起大落的情形,Oracle只会在硬解析的时候做一次取样

当临时表数据量变化之后,原来的执行计划可能已经不是最优的

碰到这种问题建议使用动态SQL

临时表的数据量在插入结束之后可以通过SQL%ROWCOUNT得知

然后在动态SQL里面拼入cardinality提示,这个提示没有必要精确,要不然你就会有无数的硬解析了

建议给它设置的坎是5000, 即1-5000当作5000处理,5001-10000当作10000,

如此类推,CARDINALITY = CEIL(SQL%ROWCOUNT/5000)*5000,

你也可以通过测试调整出一个合理的值

㈡ 临时表的redo生成

临时表不会为它们的块生成redo。因此,对临时表的操作不是“可恢复的”。

修改临时表中的一个块时,不会将这个修改记录到重做日志文件中

不过,临时表确实会生成undo,而且这个undo 会计入日志。因此,临时表也会生成一些redo。

为什么需要生成undo?这是因为你能回滚到事务中的一个SAVEPOINT

临时表可以有约束,正常表有的一切临时表都可以有

可能有一条INSERT 语句要向临时表中插入500 行,但插入到第500 行时失败了,

这就要求回滚这条语句

时间: 2024-10-08 14:10:32

Oracle临时表的应用问题的相关文章

ORACLE 临时表空间TEMP 满了怎么办?

oracle|临时表         最近遇到这样一个问题:前一段时间网页查询ORACLE表正常,可最近一直页面无法显示.打印出SQL放到PL/SQL Devoloper 执行,报"无法通过8(在表空间XXX中)扩展 temp 段",还有一个页面,可以查询出记录,但无法统计数据!       经过分析产生原因可能是:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象.  解决方法:知道由于ORACLE将表空间作为

Oracle 临时表空间使用注意

oracle|临时表 临时表空间使用注意:1.临时表空间 是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)每个用户都有一个临时表空间2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理 3.分配用户单独临时表空间,一般是针对 大型产品数据库,OLTP数据库,数据库仓库对于小型产品不需要单独制定临时表空间,使用默认临时表空间

Oracle临时表 优化查询速度

oracle|临时表|速度|优化 1.前言    目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量.当然在Oracle中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在Oracle中创建"临时表".    我对临时表的理解:在Oracle中创

Oracle临时表 使用补充

oracle|临时表 1.当指定临时表为on commit preserve rows得时候(会话级),在当前SESSION中像要将该表进行drop得时候,oracle提示:drop table student            * ERROR at line 1: ORA-14452: attempt to create, alter or drop an index on temporary table already in use   如果你要删除这样表,方法有两个:一是退出这个SES

Oracle临时表的用法及意义详解

Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中.希望本文能对大家有所帮助. 1 .前言 目前所有使用 Oracle 作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量. 当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快

ORACLE临时表总结

临时表概念    临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别.它只能存储在临时表空间,而非用户的表空间.ORACLE临时表是会话或事务级别的,只对当前会话或事务可见.每个会话只能查看和修改自己的数据.   临时表语法       临时表分类   ORACLE临时表有两种类型:会话级的临时表和事务级的临时表. 1)ON COMMIT DELETE ROWS 它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有

对比Oracle临时表和SQL Server临时表的不同点_oracle

Oracle数据库创建临时表的过程以及和SQL Server临时表的不同点的对比的相关知识是本文我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧,希望能够对您有所帮助. 1.简介 Oracle数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据.当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字

oracle 临时表详解及实例_oracle

在Oracle8i或以上版本中,可以创建以下两种临时表: 1.会话特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> ) ON COMMIT PRESERVE ROWS:  2.事务特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> ) ON COMMIT DELETE ROWS: CRE

Oracle临时表用法的经验心得

我对临时表的理解:在 Oracle 中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了. Oracle 的临时表创建之后基本不占用表空间,如果你没有指定Oracle临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在 Oracle 系统的临时表空间中( TEMP ). 临时表的创建 创建Oracle 临时表,可以有两种类型的临时表: 会话级的Oracle临时表 事务级的临时表 . 1) 会话级的临时表因为这这个

Oracle临时表(Session临时表与Transaction临时表)

一.临时表与临时表分类 临时表是在Oracle 8i中引入一种新的表的种类.Oracle数据库中的临时表是一种特殊的表,它可以作为临时保存数据的一种方式.Session级临时表是指在一个会话周期内都数据都是存在的,而一个Transaction级临时表是在Commit或Rollback之后,数据才会被清除.当然,Session结束时,Transaction级临时表数据也会被清除. 二.Session级临时表 创建Session级临时表的代码如下: create global temporary t