---
title: Oracle 租户事务型临时表实现细节-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于Oracle 租户事务型临时表实现细节相关的常见问题和使用技巧，帮助您快速解决Oracle 租户事务型临时表实现细节的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# Oracle 租户事务型临时表实现细节

更新时间：2026-08-25 02:41

适用版本： V3.1.x、V3.2.x、V3.3.x、V4.0.x、V4.1.x、V4.2.x、V4.3.x、V4.4.x 内容类型：TechNote  

## 总结说明

Oracle 租户下，事务型临时表（`ON COMMIT DELETE ROWS`）的数据主要存储在内存中。事务提交或回滚时，系统会在 `COMMIT` 操作的同时开启内部事务，以 1000 行为一个批次循环执行 `DELETE` 操作来清除数据，此过程不写入 Clog。数据在转储时可能落盘至 SSTable，事务结束时执行的 `DELETE` 操作也会清理已落盘的数据。自 V4.2.0 版本起支持动态采样以优化执行计划，V4.2.2 版本起对事务临时表的逻辑进行了调整。

## 详细说明

### 概念定义

事务型临时表是指使用 `ON COMMIT DELETE ROWS` 选项创建的全局临时表（此选项为默认选项）。其数据生命周期与事务绑定，在事务提交或回滚后，数据会自动被清除。

### 使用场景

- 存储事务处理过程中的中间结果，事务结束即释放。
 - 多会话并发处理，各会话数据需要隔离的场景。
 - 不需要跨事务持久化的临时数据处理。

### 使用方法

#### 事务级临时表

**创建语法：**

```sql
CREATE GLOBAL TEMPORARY TABLE temp_table_name (
  col1 datatype,
  col2 datatype,
  ...
) ON COMMIT DELETE ROWS;

```

`ON COMMIT DELETE ROWS` 为默认选项，可以省略。

**示例：**

```sql
CREATE GLOBAL TEMPORARY TABLE temp_order (
  order_id NUMBER,
  amount NUMBER
) ON COMMIT DELETE ROWS;

-- 会话A：插入数据，事务内可见
INSERT INTO temp_order VALUES (1, 100);
SELECT * FROM temp_order;  -- 可查到数据

-- COMMIT 后数据自动清除
COMMIT;
SELECT * FROM temp_order;  -- 无数据

-- 会话B：与会话A数据隔离，互不可见

```

### 数据存储与隔离机制

| 维度 | 说明 |
| --- | --- |
| **存储位置** | 数据主要存储在内存（MemTable/MemStore）中，转储时可能持久化到磁盘 SSTable。事务结束时，系统会通过 `DELETE` 操作清理已落盘的数据。 |
| **隔离机制** | Session 级别隔离。表结构对所有 Session 可见，但数据完全隔离，当前 Session 只能看到和修改自己的数据。 |
| **数据回收** | 事务提交（`COMMIT`）或回滚（`ROLLBACK`）时，在 `COMMIT` 操作的同时开启内部事务，以 1000 行为一个批次循环执行 `DELETE` 清除数据，直至清空。数据量大时，清理耗时可能较长。 |
| **Clog 写入** | 临时表的数据修改**不会写入 Clog**，不需要同步。 |

### 执行计划表现

| 版本 | 表现 |
| --- | --- |
| **2.x / 3.x** | 执行计划与普通表一致，支持主键和索引。但缺乏动态统计信息收集机制，当不同会话的数据量差异较大时（例如 10 行 vs 1000 万行），可能生成次优的执行计划。此外，临时表相关的 BUG 较多。 |
| **4.x** | 执行计划与普通表一致，支持主键和索引。**自 V4.2.0 起**，支持优化器动态采样（Dynamic Sampling），在 SQL 运行时动态收集统计信息，帮助优化器针对不同数据量生成更优的执行计划。4.x 版本中临时表的 BUG 显著减少。 |

**验证动态采样：**

```sql
EXPLAIN EXTENDED SELECT * FROM temp_order;
-- 查看 Optimization Info 中的 estimation method
-- 若为 DYNAMIC SAMPLING 则表示使用了动态采样

```

### 注意事项

1. **大数据量清理耗时**：事务结束时以 1000 行/批循环执行 `DELETE` 清理，若临时表数据量很大，清理耗时较久，可能影响性能。
 2. **高并发密集 COMMIT 风险**：当每个 Session 的事务时间短、`COMMIT` 操作密集时，频繁的批量清理可能带来性能压力。
 3. **数据可能落盘 SSTable**：临时表数据不写 Clog，但转储时可能落盘 SSTable。实例异常重启后，MemTable 中的数据会丢失；若数据已落盘 SSTable，重启后可能残留，需通过后续的 `DELETE` 机制清理。
 4. **版本选择**：3.x 版本临时表 BUG 较多，建议使用 4.x 较高版本（如 V4.3.5+）。**自 V4.2.2 起，事务临时表逻辑有调整**，在性能敏感场景中可考虑使用实体表替代。
 5. **执行计划调优**：V4.2.0 以下版本缺乏动态采样，当不同会话数据量差异大时，需关注执行计划质量，必要时进行手动干预。

### 实战建议

1. **版本选择**：3.x 版本临时表 BUG 较多，建议使用 V4.3.5 及以上版本。
 2. **数据量大**：若临时表数据量很大，可考虑使用实体表替代，以避免事务结束时的清理耗时。
 3. **高并发短事务**：在高并发、短事务的场景中，需关注批量清理对性能的影响，必要时进行压测验证。

## 适用版本

OceanBase 数据库 OBServer 3.x 版本，4.x 版本。

上一篇

[OceanBase 集群 Zone 缩容以及缩容期间的报错](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006836683)

下一篇

[存储过程游标执行超时导致 ORA-00600 -4067 RPC session not found](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000006802902) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
