`
sangei
  • 浏览: 335641 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

[转]oracle临时表相关知识

阅读更多
回复: 临时表存放在哪儿?

DML statements on temporary tables do not generate redo logs for the data changes. However, undo logs for the data
and redo logs for the undo logs are generated. Data from the temporary table is automatically
dropped in the case of session termination, either when the user logs off or
when the session terminates abnormally such as during a session or instance failure
  
undo logs for the data and redo logs for the undo logs  前者不是放在rollback segment中吗?怎么能写到redo log中去呢?

复: 临时表存放在哪儿?

临时表对insert/select型的应用很有用。
比如在处理web翻页时,可以通过临时表来模拟cache返回结果。
相应的,
如果是update/select or delete select型的应用使用临时表是不占多少优势的。
  
应为虽然其不直接写redo,但会通过undo间接写redo。
而insert的undo其实是用空白块回写,几乎不写redo。
相应的update/delete需要对相关db block做cp undo的操作(特别是delete),对应的redo开销也多多了。


回复: 如何在整个session中锁定某个表?-----------------------------7d335b34f403eaContent-Disposition

在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;
   CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧,我把下面两句话再贴一下:
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
冲突的问题更本不用考虑.
  
临时表只是保存当前会话(session)用到的数据,数据只在事务或会话期间存在。
  
通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表,对于事务类型的临时表,
数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在。
  
会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到
临时表的数据上。下面的语句控制行的存在性。
  
● ON COMMIT DELETE ROWS 表名行只是在事务期间可见
● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见
  
可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。表的定义对所有的会话可见。


Temporary Tables临时表
1简介
   ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,
   或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,
   但是临时表的结构以及元数据还存储在用户的数据字典中。
   临时表只在oracle8i以及以上产品中支持。
2详细介绍
   Oracle临时表分为 会话级临时表 和 事务级临时表。
会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,
临时表不需要DML锁.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的
表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.
你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效.  
临时表可以拥有触发器.
3建立临时表
   临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效.
   建立方法:
1) ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area
        (startdate DATE,
         enddate DATE,
         class CHAR(20))
      ON COMMIT DELETE ROWS;
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
  2          (startdate DATE,
  3           enddate DATE,
  4           class CHAR(20))
  5        ON COMMIT DELETE ROWS;
SQL> create table permernate( a number);
SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');
SQL> insert into permernate values(1);
SQL> commit;
SQL> select * from admin_work_area;
SQL> select  * from permernate;
A
1
2)ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area
        (startdate DATE,
         enddate DATE,
         class CHAR(20))
     ON COMMIT PRESERVE ROWS;
EXAMPLE:

会话1:
SQL> drop table admin_work_area;
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
  2          (startdate DATE,
  3           enddate DATE,
  4           class CHAR(20))
  5       ON COMMIT PRESERVE ROWS;
SQL> insert into permernate values(2);
SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');
SQL> commit;
SQL> select * from permernate;

         A
----------
         1
         2

SQL> select * from admin_work_area;

STARTDATE  ENDDATE    CLASS
---------- ---------- --------------------
17-1?? -03 17-1?? -03 session temperary

会话2:

SQL> select * from permernate;

         A
----------
         1
         2

SQL> select * from admin_work_area;

未选择行.

会话2看不见会话1中临时表的数据.



4 ORACLE临时表和SQLSERVER临时表异同

SQL SERVER临时表
也可以创建临时表。临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。
有本地和全局两种类型的临时表,二者在名称、可见性和可用性上均不相同。本地临时表的名称以单个数字符号 (#) 打头;
它们仅对当前的用户连接是可见的;当用户从 Microsoft? SQL Server? 2000 实例断开连接时被删除。全局临时表的名称以数学符号
(##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。
例如,如果创建名为 employees 的表,则任何人只要在数据库中有使用该表的安全权限就可以使用该表,除非它已删除。
如果创建名为 #employees 的本地临时表,只有您能对该表执行操作且在断开连接时该表删除。如果创建名为 ##employees 的全局临时表
,数据表中的任何用户均可对该表执行操作。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果该表在您创建
后有其他用户使用,则 SQL Server在所有用户断开连接后删除该表
不同:
1.        SQL SERVER临时表是一种”内存表”,表是存储在内存中的.ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中.
2.        SQL SERVER临时表不存在类似ORACLE临时表 事务级别 上的功能.
3        SQL SERVER本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,ORACLE不会删除表.
4        SQL SERVER的全局临时表(##) 是指多个连接共享同一片内存.当没有指针引用该内存区域时,SQL SERVER自动释放全局临时表.
5        由于ORACLE不是一种 内存中的数据库. 所以如果ORACLE类似SQL SERVER 频繁的对临时表进行建立和删除,必定会影响性能.
所以ORACLE会保留临时表的定义直到用户DROP TABLE.
6        在ORACLE中,如果需要多个用户共享一个表(类似SQL SERVER的全局临时表##).则可以利用永久表,
并且在表中添加一些可以唯一标识用户的列.利用触发器和视图.当用户退出的时候,根据该登陆用户的唯一信息删除相应的表中的数据.
这种方法给ORACLE带来了一定量的负载.

<script type="text/javascript"></script>

分享到:
评论

相关推荐

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

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

    oracle临时表用法

    下面是 Oracle 临时表的详细知识点: 创建临时表 创建临时表的语法为: ``` CREATE GLOBAL TEMPORARY TABLE table (column datatype [DEFAULT expr] [{ NULL | NOT NULL}], [column datatype [DEFAULT expr] [ {...

    oracle-临时表空间

    ### Oracle 临时表空间详解 #### 一、Oracle表空间概览 在Oracle数据库系统中,数据被组织成多个逻辑单元,这些单元被称为表空间。每个表空间由一个或多个物理磁盘文件(称为数据文件)组成,并且是数据库中的最高...

    不让临时表空间影响ORACLE数据库性能

    在Oracle数据库系统中,临时表空间是用于存储临时数据的特定区域,这些数据通常由排序、聚合、JOIN等操作产生。当处理大量数据或者运行复杂SQL查询时,临时表空间的作用尤为关键。然而,如果不正确地管理和使用临时...

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

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

    oracle数据表分区知识

    #### 一、分区表理论知识 Oracle 提供了表分区功能以支持非常大型的数据库(VLDB)。通过分区技术,可以根据指定的分区键将数据分散到不同的物理位置,从而实现更高效的数据管理和查询性能。表分区使得数据能够根据...

    Oracle 表空间 收缩

    2. **移动表、索引等对象**:将block_id大于目标表空间大小的表、索引、分区表等对象移动到一个新的临时表空间中。 3. **收缩表空间**:在确保所有对象都已妥善处理后,执行收缩操作。 4. **移动对象回原表空间**:...

    数据同步时过滤掉临时表(转)

    总结来说,"数据同步时过滤掉临时表"是一个关于数据迁移和管理的重要实践,它涉及到数据库操作、脚本编写、工具使用以及性能优化等多个IT领域的知识。理解和掌握这部分内容对于任何处理大规模数据的IT专业人员都至关...

    oracle 系统表大全

    以上就是基于给定的Oracle系统表相关知识的详细介绍。这些系统表为DBA和开发人员提供了强大的工具来管理和优化数据库性能。通过深入理解和利用这些系统表,可以有效地提高数据库的可用性和效率。

    oracle查看表空间表信息

    36. **TEMPORARY**: 是否临时表。 37. **SECONDARY**: 是否为辅助键表。 38. **NESTED**: 是否嵌套表。 39. **BUFFER_POOL**: 缓冲池。 40. **ROW_MOVEMENT**: 行移动。 41. **GLOBAL_STATS**: 全局统计信息。 42. *...

    Oracle 12c中的表空间管理、用户和角色、临时Undo.pdf

    在创建临时表空间时,可以设置默认的临时表空间,并通过视图查询相关信息。 三、CDB表空间大小查询 在Oracle 12c中,支持多租户架构,CDB(容器数据库)能够包含多个PDB(可插拔数据库)。可以对CDB中的表空间进行...

    oracle定时删除表空间的数据并释放表空间

    3. **purge操作**:Purge操作是删除已删除行的一种方法,通常用于临时表空间和Undo表空间。执行`PURGE`语句可以立即释放被删除的对象或行,而不是等待下次DML操作或数据库维护任务。 4. **DBMS_SCHEDULE包**:...

    创建Oracle表空间

    临时表空间用于存储数据库操作中的临时数据,如排序操作、哈希和临时表。与永久性表空间不同,临时表空间不会记录在重做日志中,因为这些操作不涉及事务持久性。创建临时表空间的命令通常包括指定表空间名称、临时...

    oracle系统表查询

    以下是对给定文件中的Oracle系统表查询知识点的深入解析: ### 一、用户 - **`SELECT username FROM dba_users;`**:此SQL语句用于列出数据库中所有的用户。`dba_users`视图提供了数据库中所有用户的信息,包括...

    ORACLE内存结构与表空间知识

    ### ORACLE内存结构与表空间知识 #### 一、Oracle的服务方式 Oracle提供了三种不同的服务方式,每种方式都有其特定的应用场景和内存管理特点。 ##### 1. 专用服务器 (Dedicated Server) - **服务流程**:当...

    oracle数据库表分区实例

    最后,我们可以通过以下命令来查看所有非临时表的分区信息: ```sql SELECT table_name, partition_name, u.high_value FROM user_tab_partitions u WHERE table_name NOT LIKE 'BIN%'; ``` 如果不再需要某个分区,...

    查询oracle表以及统计数据库的使用情况

    `Dba_Free_Space`视图用于获取每个表空间的空闲空间总量,而`Dba_Temp_Files`视图则提供了临时表空间的相关信息。 在进行数据库性能监控时,了解这些信息至关重要,因为它们可以帮助识别潜在的问题,比如空间不足、...

    NC6.5 数据库参考脚本及临时表空间配置.pdf

    根据提供的文件信息,本文将详细说明关于“NC6.5 数据库参考脚本及临时表空间配置”的知识点。 首先,文档标题“NC6.5 数据库参考脚本及临时表空间配置.pdf”指出了文件内容涉及三个方面:NC6.5数据库、参考脚本...

    创建ORACLE表空间

    Oracle中的表空间分为永久表空间和临时表空间两种类型。 1. **永久表空间**:用于存储数据表、索引等持久性数据。 2. **临时表空间**:主要用于SQL执行过程中的临时排序操作等。 #### 二、创建表空间的步骤与语法 ...

    \Oracle 外部表

    ### Oracle 外部表知识点详解 #### 一、外部表的概念及特性 **定义与功能:** 外部表是Oracle数据库自9i版本开始引入的一种特殊表类型,它并不存储在数据库内部,而是指向操作系统文件系统中的某个文件。通过这种...

Global site tag (gtag.js) - Google Analytics