1 临时表的基本概念

临时表是建立在系统临时文件夹中的表

临时表只能存储在临时表空间中,而非用户的表空间

1.1 目的

1)当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中

2)程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等

1.2 临时表分类

事务级临时表 ON COMMIT DELETE ROWS

会话级临时表 ON COMMIT PRESERVE ROWS

两种临时表的相同点:两种表都不能永久的保存记录,他们都是用临时表空间。

两种临时表的不同点:事务级临时表在提交后就回被清空, 会话级临时表只有在会话断开后才会被清空

2. 事务级临时表

2.1 生命周期

数据在事务提交或回滚时自动清除。

2.2 作用范围

仅对当前事务可见。

2.3 语法格式

CREATE GLOBAL TEMPORARY TABLE 表名 (

[列定义1],

    [列定义2],

    ...

)

ON COMMIT DELETE ROWS;    -- 事务级

2.4 事务级临时表的使用

students表的定义及存储数据:

创建一个用于存储students表中数据的事务级临时表students_temp_delete,临时表的列定义要与被存储的数据表相同,否则会出现列表不匹配:

在事务中对事务级临时表student_temp_delete进行插入students表中的全部数据,并且进行查询:

清空students_temp_delete中的全部数据后,再次像之前一样插入students的全部数据,但这次在插入结束后用commit提交事务,然后进行查询语句。可以看到事务级临时表没有任何数据,这是因为事务级临时表在事务提交或者回滚之后数据会被立即清除。

3. 会话级临时表

3.1 生命周期

数据在会话结束时(断开连接)自动清除。

3.2 作用范围

仅对当前会话可见,其他会话无法访问。

3.3 语法格式

CREATE GLOBAL TEMPORARY TABLE 表名 (

[列定义1],

    [列定义2],

    ...

)

ON COMMIT PRESERVE ROWS;  -- 会话级(默认)

3.4 会话级临时表的使用

继续使用students表的结构定义和数据。

创建一个用于存储students表中数据的会话级临时表students_temp,临时表的列定义要与被存储的数据表相同,否则会出现列表不匹配:

临时表创建完毕后会存储在表空间的temp的表空间中,不同于普通数据表创建完毕后存储在模式的表空间中,具体如下图所示:

将students中的数据插入会话级临时表students_temp中,并select查询students_temp:

点击断开连接,会话结束:

重新连接后,再次查询students_temp表,可以看到查询结果为空,数据已经被自动清除:

4 两种表的特点及使用场景

4.1 特点

事务级临时表

  • 使用 ON COMMIT DELETE ROWS 关键字创建。
  • 数据在事务提交或回滚后自动被清除。
  • 数据在事务范围内可见,事务结束后数据不再保留。
  • 适合处理事务内部的临时数据,例如中间计算结果。
  • 临时表的表结构在事务结束后仍保留,但数据被清除。

会话级临时表

  • 使用 ON COMMIT PRESERVE ROWS 关键字创建。
  • 数据在会话结束时才被清除。
  • 数据在会话期间内可见,适合保存跨多个事务的临时数据。
  • 会话结束后,临时表的表结构仍然存在,数据被删除。
  • 会话级临时表的数据在不同会话之间是隔离的,一个会话无法访问另一个会话的临时表数据。

4.2 使用场景

事务级临时表

  • 当需要在事务中临时存储数据,并在事务结束后不再需要这些数据时使用。
  • 适用于OLTP(在线事务处理)场景,例如处理复杂的事务性操作时的中间数据缓存。

会话级临时表

  • 当需要在一个会话中多次使用临时数据,并且这些数据可能跨越多个事务时使用。
  • 适用于需要在多个事务中共享中间结果的场景,例如复杂的报表生成或批量处理任务。

达梦技术社区 | 达梦数据库: 达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐