`
linsea
  • 浏览: 90046 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle 临时表

阅读更多

 

Oracle 临时表

临时表(Temporary table)用于保存事务或会话期间的中间结果集。临时表中保存的数据只对当前会话可见,所有会话都看不到其他会话的数据;临时表比常规表生成的redo少得多。不过,由于临时表必须为其中包含 的数据生成undo信息, 所以也会生成一定的redo UPDATEDELETE会生成最多的undo INSERTSELECT生成的undo最少。

对于临时表,运行时当一个会话第一次在临时表中放入数据时,才会为该会话创建一个临时段。由于每个会话会得到其自己的临时段(而不是一个现有段的一个区段),每个用户可能在不同的表空间为其临时表分配空间。

Oracle 临时表与其他关系数据库中的临时表类似,这样区别只是:Oracle的临时表是“静态”定义的。每个数据库只创建一次临时表,而不是为数据库中的每个存储过程都创建一次。在Oracle中,临时表一定存在,它们作为对象放在数据字典中,但是在会话向临时表中放入数据之前,临时表看上去总是空。由于临时表是 静态定义的,所以你能创建引用临时表的视图,还可以创建存储过程使用静态SQL来引用临时表,等等。临时表可以是基于会话的(临时表中的数据可以跨提交存 在,即提交之前仍然存在,但是断开连接后再连接后再连接时数据就没有了),也可以是基于事务的(提交之后数据就消失)。下面这个例子显示了这两种不同的临 时表。我使用SCOTT.EMP表作为一个模板:

ops$tkyte@ORA10G> create global temporary table temp_table_session

2      on commit preserve rows

3      as

4      select * from scott.emp where 1=0

5      /

Table created.

ON COMMIT PRESERVE ROWS 子句使得这是一个基于会话的临时表。在我的会话断开连接之前,或者我通过一个DELETETRUNCATE物理地删除行之前,这些行会一直存在于这个临时表中。

 

ops$tkyte@ORA10G> create global temporary table temp_table_transaction

2      on commit delete rows

3      as

4      select * from scott.emp where 1=0

5      /

Table created.

ON COMMIT DELETE ROWS 子句使得这是一个基于事务的临时表。我的会话提交时,临时表中的行就不见了。只需把分配给这个表的临时区段交回,这些行就会消失,在临时表的自动清除过程中不存在开销。

 

如果你曾在SQL Server/ Sybase中用过临时表,现在所要考虑的主要问题是:不应该执行SELECT X, Y, Z INTO #TEMP FROM SOME_TABLE来动态创建和填充一个临时表,而应该:

l         将所有全局临时表只创建一次,作为应用安装的一部分,就像是创建永久表一样。

l         在你的过程中,只需执行INSERT INTO TEMP(X, Y, Z) SELECT X, Y, Z FROM SOME_TABLE

归根结底,这里的目标是:不要在运行时在你的存储过程中创建表。这不是Oracle 中使用临时表的正确做法。DDL是一种代价昂贵的操作:你要全力避免在运行时执行这种操作。一个应用的临时表应该在应用安装期间创建,绝对不要在运行时创建。

临时表可以有永久表的许多属性。它们可以有触发器、检查约束、索引等。但永久表的某些特性在临时表中并不支持,这包括:

l         不能有引用完整性约束。临时表不能作为外键的目标,也不能在临时表中定义外键。

l         不能有 NESTED TABLE类型的列。 Oracle 9i及以前版本中, VARRAY类型的列也不允许;不过Oracle 10g中去掉了这个限制。

l         不能是 IOT

l         不能在任何类型的聚簇中。

l         不能分区。

l         不能通过ANALYZE表命令生成统计信息。

 

在所有数据库中,临时表的缺点之一是优化器不能正常地得到临时表的真实统计。(但是有人为的方法改进,这里的具体的方法参考书本的内容,在此略!

 

临时表小结

如果应用中需要临时存储一个行集由其他表处理(可能对应一个会话,也可能对应一个事务),临时表就很有用。不要把临时表作为一个分解大查询的方法,即拿到一 个大查询,把它“分解”为几个较小的结果集,然后再把这些结果集合并在一起(这看来是其他数据库中最常见的临时表用法)。实际上,你会发现,在几乎所有的 情况下。Oracle中如果将一个查询分解为较小的临时表查询,与原来的一个查询相比,只会执行得更慢。我就经常看到人们这样做,如果有可能把对临时表的 一系列INSERT重写为一个大查询(SELECT),所得到的单个查询会比原来的多步过程快得多。

临时表会生成少量的redo,但是确实还是会生成redo,而且没有办法避免。这些redo是为回滚数据生成的,而且在最典型的情况下,可以忽略不计。如果 只是对临时表执行INSERTSELETE,生成的redo量几乎注意不到。只有对临时表执行大量DELETEUPDATE 时,才会看到生成大量的redo

如果精心设计,可以在临时表上生成CBO 使用的统计信息;不过,可以使用DBMS_STATS包对临时表上的统计给出更好的猜测,或者由优化器使用动态采样在硬解析时动态收集。 

 

分享到:
评论

相关推荐

    Oracle临时表空间满的解决步骤

    解决 Oracle 临时表空间满的问题需要通过查看当前数据库的默认临时表空间、查看当前临时表空间的大小、创建新的临时表空间、将新建的临时表空间设置为数据库的默认临时表空间、删除原来的临时表空间、创建新的临时表...

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

    Oracle 临时表空间不足和批处理缓慢问题探讨 本文探讨了 Oracle 临时表空间不足和批处理缓慢问题的原因和解决方法。通过分析和测试,发现了问题的根源在于应用逻辑方面,具体来说是 SQL 语句的编写问题。通过编写...

    Oracle 临时表用法

    本文将详细介绍Oracle临时表的创建方法、使用场景以及优缺点,帮助读者更好地理解和运用这一特性。 #### 二、Oracle临时表概述 Oracle临时表是一种特殊的表,用于存储临时数据,通常用于事务处理或特定会话期间的...

    Oracle临时表

    ### Oracle临时表详解 #### 一、Oracle临时表概述 在Oracle数据库中,临时表是一种特殊类型的数据表,主要用于存储暂时性的数据。与永久表不同的是,临时表中的数据不会一直保留,而是根据不同的条件(如事务结束...

    oracle临时表用法

    Oracle 临时表用法 Oracle 临时表是一种特殊的表结构,它可以在数据库中临时存储数据,用于实现一些特定的应用场景。下面是 Oracle 临时表的详细知识点: 创建临时表 创建临时表的语法为: ``` CREATE GLOBAL ...

    oracle临时表(事务级、会话级).docx

    "Oracle 临时表(事务级、会话级)" Oracle 临时表是 Oracle 数据库中的一种特殊类型的表,它可以保存一个会话或事务中的数据。当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在...

    Oracle 临时表空间使用注意

    Oracle 临时表空间是Oracle...总之,理解并正确使用Oracle临时表空间是确保数据库高效运行的关键。通过对临时表空间的合理配置和管理,可以有效地提升数据库的响应速度,降低系统资源消耗,从而优化整体的数据库性能。

    oracle临时表

    Oracle临时表是数据库管理系统中的一种特殊表,它主要用于在会话期间存储临时数据,供当前会话使用。这种表在会话结束时会被自动删除,不会永久保存在数据库中,因此,它们对于处理大量中间结果或者进行复杂计算的...

    Oracle 临时表之临时表的应用问题

     临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。  with子查询实际上也是用了临时表,...

    Oracle 临时表用法汇总

    临时表的应用 1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。 2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个...

    Oracle释放临时表空间脚本

    ### Oracle 临时表空间管理与释放脚本解析 在Oracle数据库管理中,临时表空间(Temporary Tablespace)的管理是一项非常重要的任务。合理的管理和优化临时表空间不仅可以提高系统的性能,还可以帮助解决空间不足等...

    ORACLE中临时表

    Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...

    Oracle临时表空间处理.txt

    ### Oracle 临时表空间管理详解 #### 一、概述 Oracle 数据库中的临时表空间主要用于存储临时对象,如排序操作、表连接等过程中产生的临时数据。这些数据在事务结束后会被自动清除,不会占用永久存储空间。正确管理...

    OracleTemporaryTables(Oracle临时表).docx

    Oracle Temporary Tables,也称为Oracle临时表,是Oracle数据库系统中用于存储临时数据的特殊类型表。它们主要用于处理会话级别的数据,这些数据在特定会话或事务结束后会被自动清理,从而减少了对永久表的负担和...

    oracle自增长与临时表

    **二、Oracle临时表** 临时表在Oracle中用于在单个会话中存储临时数据,这些数据只对创建它们的会话可见,会话结束时,临时表及其数据都会被自动删除。 1. **创建临时表**:使用`CREATE GLOBAL TEMPORARY TABLE`...

    OracleTemporaryTables(Oracle临时表).pdf

    Oracle Temporary Tables,也称为Oracle临时表,是在Oracle数据库中用于临时存储数据的特殊表。它们主要用在处理大型数据集时提高性能,特别是在复杂的查询和存储过程中。临时表的生命周期和可见性根据创建时指定的...

    oracle 临时表使用例子并用CURSOR返回结果集的例子

    本篇文章将深入探讨Oracle临时表的使用,并通过一个使用游标(CURSOR)返回结果集的例子来进一步理解其用法。 首先,让我们了解如何创建Oracle临时表。临时表的创建语法与普通表类似,但我们需要使用`GLOBAL ...

    oracle临时表操作学习资料

    Oracle数据库中的临时表是一种特殊的表类型,主要用于存储在特定会话或事务期间产生的临时数据。与常规的永久表相比,临时表的数据不会永久保存,而是会在会话结束或事务完成时自动清除,无需用户手动删除。 1. **...

    一个开发需求的解决方案Oracle临时表介绍.docx

    创建Oracle临时表的语法是`CREATE GLOBAL TEMPORARY TABLE`,并且可以指定`ON COMMIT`子句来决定数据何时清除,交易级别(Transaction)或会话级别(Session)。交易级别意味着在每次提交时清空表,而会话级别则是在...

    oracle查找定位占用临时表空间较大的SQL语句方法

    oracle查找定位占用临时表空间较大的SQL语句方法,包括:(1)造成临时表空间暴涨的SQL还在运行中(2)造成临时表空间暴涨的SQL已经运行过了。

Global site tag (gtag.js) - Google Analytics