oracle临时表

本文介绍了Oracle数据库中的临时表,包括会话级和事务级临时表的区别及使用方式。详细讲解了临时表的特点,如数据自动清理机制、索引与视图的创建、以及空间分配等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空(truncate),但是临时表的结构以及元数据还存储在用户的数据字典中。


1简介

ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空(truncate),但是临时表的结构以及元数据还存储在用户的数据字典中。

In addition to permanent tables, Oracle can create temporary tables to hold session-private data that exists only for the duration of a transaction or session.

Temporary tables are supported by Oracle9i and Oracle8i.

2详细介绍

Oracle临时表分为 会话级临时表 和 事务级临时表。

会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。

事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。

临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。

The CREATE GLOBAL TEMPORARY TABLE statement creates a temporary table that can be transaction-specific or session-specific. For transaction-specific temporary tables, data exists for the duration of the transaction. For session-specific temporary tables, data exists for the duration of the session. Data in a temporary table is private to the session. Each session can only see and modify its own data. DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data.

DML操作的临时表不产生redo log重作日志,但会产生回滚日志Undo log;Undo的产生(rollback segment)会产生Redo log。

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.

当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.

A TRUNCATE statement issued on a session-specific temporary table truncates data in its own session. It does not truncate the data of other sessions that are using the same table.

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.

你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 临时表可以拥有触发器.

You can create indexes for temporary tables using the CREATE INDEX statement. Indexes created on temporary tables are also temporary, and the data in the index has the same session or transaction scope as the data in the temporary table.

You can create views that access both temporary and permanent tables. You can also create triggers on temporary tables.

空间分配Segment Allocation(v$sort_usage)

Temporary tables use temporary segments. Unlike permanent tables, temporary tables and their indexes do not automatically allocate a segment when they are created. Instead, segments are allocated when the first INSERT (or CREATE TABLE AS SELECT) is performed. This means that if a SELECT, UPDATE, or DELETE is performed before the first INSERT, then the table appears to be empty.

Temporary segments are deallocated at the end of the transaction for transaction-specific temporary tables and at the end of the session for session-specific temporary tables.

临时表在一些版本中存在BUG可能产生过多的REDO LOG。eygle 的站点http://www.eygle.com/faq/temp_table.htm

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中临时表的数据

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
<think>我们被要求解释Oracle临时表的使用和定义。根据用户提供的引用,我们可以总结如下: 引用[1]指出:临时表是用于存储临时数据(中间数据)的数据库对象。它存储在临时表空间中,而不是用户的表空间。Oracle临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。 引用[2]提到:由于Oracle不是内存数据库,频繁创建和删除临时表会影响性能。因此,Oracle会保留临时表的定义直到用户显式删除(DROP TABLE)。 引用[3]对比了业务表和临时表的区别: - 存储位置:业务表在永久表空间,临时表临时表空间。 - 生命周期:业务表数据持久化,临时表数据在会话结束(会话级)或事务提交/回滚(事务级)时自动清除。 - 并发访问:业务表支持多会话并发访问,临时表数据仅对当前会话可见。 - 索引与约束:临时表支持主键、唯一约束和普通索引,但不支持外键(通常)。 - 性能:临时表的操作通常不产生重做日志(redo),因此性能更高。 引用[4]展示了全局临时表的undo使用情况,说明插入数据到全局临时表时,产生的redo很少(28528字节,而常规表会产生大量redo),并且undo块使用也较少(4个undo块,55条undo记录)。 根据以上引用,我们可以整理回答如下: ### Oracle临时表的使用和定义 #### 1. **临时表的定义** Oracle临时表(Temporary Table)是一种特殊的数据库对象,用于存储会话或事务期间的临时数据。与普通表(业务表)不同,临时表的数据存储在临时表空间中,且数据具有特定的生命周期(会话级或事务级)。临时表的定义(结构)是持久的,直到被显式删除,但数据是临时的。 #### 2. **临时表的分类** 根据数据清除的时机,Oracle临时表分为两种: - **事务级临时表(ON COMMIT DELETE ROWS)**:数据在事务提交(COMMIT)或回滚(ROLLBACK)时自动清除。 - **会话级临时表(ON COMMIT PRESERVE ROWS)**:数据在整个会话期间保留,直到会话结束(断开连接)或显式删除。 #### 3. **创建临时表** 创建临时表的语法如下: ```sql -- 事务级临时表 CREATE GLOBAL TEMPORARY TABLE temp_table_trans ( id NUMBER, name VARCHAR2(50) ) ON COMMIT DELETE ROWS; -- 会话级临时表 CREATE GLOBAL TEMPORARY TABLE temp_table_sess ( id NUMBER, name VARCHAR2(50) ) ON COMMIT PRESERVE ROWS; ``` 注意:临时表必须使用`GLOBAL TEMPORARY`关键字。 #### 4. **临时表的特性** - **数据隔离**:每个会话只能看到自己插入的数据,即使多个会话使用同一个临时表名,它们的数据也互不影响[^1]。 - **性能优势**:对临时表的DML操作(INSERT/UPDATE/DELETE)通常不生成重做日志(redo),只生成少量的undo日志,因此性能较高[^4]。 - **索引与约束**:临时表可以创建索引(包括主键和唯一约束),但不支持外键约束[^3]。 - **存储空间**:临时表的数据存储在临时表空间中,不会占用永久表空间。 #### 5. **临时表的使用场景** - 存储中间结果集,用于复杂查询的阶段性处理。 - 在批处理过程中暂存数据,避免干扰业务表。 - 需要会话隔离的临时数据存储(如用户登录会话的临时数据)。 #### 6. **使用示例** ```sql -- 创建事务级临时表 CREATE GLOBAL TEMPORARY TABLE gtt_order_summary ( product_id NUMBER, total_sales NUMBER ) ON COMMIT DELETE ROWS; -- 插入数据(当前事务内有效) INSERT INTO gtt_order_summary SELECT product_id, SUM(amount) FROM orders GROUP BY product_id; -- 查询(仅当前事务内可见) SELECT * FROM gtt_order_summary; -- 事务提交后,数据自动清除 COMMIT; ``` #### 7. **注意事项** - **定义持久化**:临时表的定义(结构)会一直存在,直到执行`DROP TABLE`命令[^2]。 - **避免频繁创建/删除**:由于表定义的创建和删除开销较大,建议在应用初始化时创建,长期保留。 - **事务控制**:事务级临时表在事务结束时自动清除数据,因此不要在事务外查询(事务提交后数据消失)。 - **空间管理**:临时表空间需要足够大小,否则可能因空间不足导致操作失败。 ### 总结 Oracle临时表是处理临时数据的有效工具,通过隔离会话数据、减少日志生成来提高性能。根据数据保留需求选择事务级或会话级临时表,并注意合理管理表定义和临时表空间[^1][^3][^4]。 §§相关问题§§ 1. Oracle临时表和内存表有什么区别? 2. 如何监控临时表空间的使用情况? 3. 临时表在数据仓库ETL过程中的应用有哪些? 4. 临时表与WITH子句(CTE)在性能上的差异? 5. 如何为临时表创建索引以优化查询性能?</think>### Oracle临时表的使用与定义详解 #### 一、临时表的核心定义 Oracle临时表是专门用于存储**会话或事务级别临时数据**的特殊数据库对象,与普通业务表有本质区别: 1. **存储位置**:数据仅存储在临时表空间中,而非永久表空间[^1][^3] 2. **数据生命周期**: - 事务级:`ON COMMIT DELETE ROWS` → 事务提交/回滚时自动清除数据 - 会话级:`ON COMMIT PRESERVE ROWS` → 会话断开时自动清除数据[^1] 3. **数据可见性**:仅对当前会话可见,不同会话间的数据完全隔离[^1][^3] #### 二、创建语法与类型 ```sql -- 事务级临时表(提交后数据消失) CREATE GLOBAL TEMPORARY TABLE temp_transaction ( id NUMBER PRIMARY KEY, data VARCHAR2(100) ) ON COMMIT DELETE ROWS; -- 会话级临时表(断开连接后数据消失) CREATE GLOBAL TEMPORARY TABLE temp_session ( id NUMBER, result CLOB ) ON COMMIT PRESERVE ROWS; ``` #### 三、核心特性对比 | 特性 | 业务表 | 临时表 | |---------------------|---------------------|-------------------------| | **数据存储位置** | 永久表空间 | 临时表空间[^3] | | **数据生命周期** | 永久保存 | 会话/事务结束时清除[^1] | | **并发访问** | 多会话共享 | 仅创建会话可见[^3] | | **重做日志(Redo)** | 完整记录 | 基本不生成[^4] | | **索引支持** | 所有索引类型 | 主键/唯一索引/普通索引 | | **外键约束** | 支持 | 通常不支持[^3] | #### 四、典型使用场景 1. **中间结果集处理** ```sql -- 在复杂计算中暂存中间结果 INSERT INTO temp_session SELECT employee_id, SUM(salary) FROM employees GROUP BY department_id; ``` 2. **批量数据预处理** ```sql -- 事务级临时表用于ETL临时存储 INSERT INTO temp_transaction SELECT * FROM source_table WHERE create_date > SYSDATE-1; -- 后续处理(事务提交后自动清空) UPDATE target_table t SET t.value = (SELECT data FROM temp_transaction tmp WHERE tmp.id = t.id); ``` 3. **会话级数据缓存** ```sql -- 存储用户会话的临时配置 INSERT INTO temp_session VALUES (1, '{"theme":"dark"}'); -- 同一会话中可多次读取 SELECT result FROM temp_session WHERE id=1; ``` #### 五、性能优势原理 1. **极少的Redo日志** 临时表的DML操作基本不生成重做日志,显著减少I/O开销[^4] ```sql -- 插入万行数据仅产生约28KB redo(常规表需MB级) INSERT INTO gtt_test SELECT 1 FROM dual CONNECT BY LEVEL < 10000; -- 统计输出:28528 redo size[^4] ``` 2. **高效的Undo管理** 事务级临时表仅需少量undo块(示例中仅4个undo块处理55条记录)[^4] 3. **空间自动回收** 数据自动清除机制避免手动维护成本[^2] #### 六、最佳实践 1. **定义持久化原则** 创建后保留表定义,避免频繁`CREATE/DROP`(Oracle会保留定义直到显式删除)[^2] 2. **索引使用策略** ```sql -- 在频繁查询的列创建索引 CREATE INDEX idx_temp ON temp_session(id); -- 注意:索引也存储在临时表空间 ``` 3. **与CTE的取舍** | 场景 | 推荐方案 | |---------------------|-------------------| | 简单中间结果(<100行) | WITH子句(CTE) | | 大中间结果/多次引用 | 临时表 | | 跨程序单元调用 | 临时表 | 4. **空间监控** ```sql -- 检查临时表空间使用 SELECT tablespace_name, used_blocks FROM v$sort_segment; ``` #### 七、使用限制 1. 不支持外键约束 2. 不能作为永久表的子表 3. 分区功能有限制 4. 不支持在线重定义 > **关键区别总结**:临时表本质是**数据临时性+定义持久性**的组合,特别适合需要会话隔离、减少日志生成的中间数据处理场景[^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值