梁敬彬梁敬弘兄弟出品

DM的临时表 ON COMMIT 关键词指定表中的数据是事务级还是或会话级的,默认情况下是事务级的。

  1. ON COMMIT DELETE ROWS:指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除;

  2. ON COMMIT PRESERVE ROWS:指定临时表是会话级的,会话结束时才清空表,并释放临时 B 树。

接下来我们来做系列测试

[root@dm1 bin]# ./disql ljb/DAMENG123@localhost:5237

服务器[localhost:5237]:处于普通打开状态

登录使用时间: 36.942(毫秒)

disql V7.6.0.96-Build(2018.09.19-97292)ENT

Connected to: DM 7.1.6.96

构建基于会话的全局临时表

SQL> --drop table ljb_tmp_session;


2   create global temporary table ljb_tmp_session on commit preserve rows as select  * from dba_objects where 1=2;


操作已执行


已用时间: 175.972(毫秒). 执行号:378.


SQL> select table_name,temporary,duration from user_tables  where table_name='LJB_TMP_SESSION';


行号     TABLE_NAME      TEMPORARY DURATION   


---------- --------------- --------- -----------


1          LJB_TMP_SESSION Y         SYS$SESSION



已用时间: 114.216(毫秒). 执行号:379.


构建基于事务的全局临时表


SQL> --drop table  ljb_tmp_transaction;


2   create global temporary table ljb_tmp_transaction on commit delete rows as select * from dba_objects where 1=2;


操作已执行


已用时间: 7.935(毫秒). 执行号:380.


SQL> select table_name, temporary, DURATION from user_tables  where table_name='LJB_TMP_TRANSACTION';


行号     TABLE_NAME          TEMPORARY DURATION       

---------


1          LJB_TMP_TRANSACTION Y         SYS$TRANSACTION


已用时间: 74.983(毫秒). 执行号:381.



插入数据


SQL> 


1   insert all 
2      into  ljb_tmp_transaction
3      into  ljb_tmp_session
4   select * from dba_objects;
影响行数 2810


已用时间: 57.722(毫秒). 执行号:382.

SQL> select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),

2    (select count(*) transaction_cnt from ljb_tmp_transaction);

行号     SESSION_CNT          TRANSACTION_CNT     

---------- -------------------- --------------------

1          1405                 1405

已用时间: 49.858(毫秒). 执行号:383.

提交后,基于事务的表没记录了,基于SESSION的,还有记录

SQL> 

1   commit;

操作已执行

已用时间: 0.626(毫秒). 执行号:384.

SQL> select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),

2   (select count(*) transaction_cnt from ljb_tmp_transaction);

行号     SESSION_CNT          TRANSACTION_CNT     

---------- -------------------- --------------------

1          1405                 0

已用时间: 1.613(毫秒). 执行号:385.

**退出SESSION后,数据就都没了**

SQL> exit

[root@dm1 bin]# ./disql ljb/DAMENG123@localhost:5237

服务器[localhost:5237]:处于普通打开状态

登录使用时间: 42.644(毫秒)


disql V7.6.0.96-Build(2018.09.19-97292)ENT 

Connected to: DM 7.1.6.96

SQL> select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),

2   (select count(*) transaction_cnt from ljb_tmp_transaction);

行号     SESSION_CNT          TRANSACTION_CNT     

---------- -------------------- --------------------

1          0                    0


已用时间: 2.056(毫秒). 执行号:386.

SQL> 

达梦的全局临时表和Oracle的全局临时表基本没有差异,可以有效的应用在接口程序和临时数处理的场景

以下是DM官方文档的描述部分

当处理复杂的查询或事务时,由于在数据写入永久表之前需要暂时存储一些行信息或需要保存查询的中间结果,可能需要一些表来临时存储这些数据。 DM 允许创建临时表来保存会话甚至事务中的数据。在会话或事务结束时,这些表上的数据将会被自动清除。临时表中的数据不能像在其它永久表中的数据那样进行备份,当事务结束或会话断开时,数据就会被清空。 在临时表创建过程中,不会像永久表和索引那样自动分配数据段,而是仅当第一次执行 DML 语句时,才会为临时表在临时表空间中分配空间。并且,对于不同的会话,临时表上的数据是独享的,不会互相干扰,即会话 A 不能访问会话 B 临时表上的数据。对复杂查询的传统响应方式之一是使用一个视图,使复杂查询更易于操作。但是,视图在每次访问时都需要执行,因而大大降低了性能。而通过 AS SELECT 子句建立的临时表是将复杂查询的结果通过临时 B 树记录了下来,下次访问不用重新执行查询就可以获得数据,且会话或事务结束后数据将自动删除,是复杂查询的一个优秀的解决方案,且提高了性能。

DM 临时表支持以下功能:

  1. 在临时表中,会话可以像普通永久表一样更新、插入和删除数据;

  2. 临时表的 DML 操作产生较少的 REDO 日志;

  3. 临时表支持建索引,以提高查询性能;

  4. 在一个会话或事务结束后,数据将自动从临时表中删除;

  5. 不同用户可以访问相同的临时表,每个用户只能看到自己的数据;

  6. 临时表的数据量很少,意味着更高效的查询效率;

  7. 临时表的表结构在数据删除后仍然存在,便于以后的使用;

  8. 临时表的权限管理跟普通表一致。

临时表 ON COMMIT 关键词指定表中的数据是事务级还是或会话级的,默认情况下是事务级的。

  1. ON COMMIT DELETE ROWS:指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除;

  2. ON COMMIT PRESERVE ROWS:指定临时表是会话级的,会话结束时才清空表,并释放临时 B 树。

在这里插入图片描述

国内一线知名数据库专家、畅销书《收获,不止Oracle》作者梁敬彬老师,做客【达梦会客厅】

达梦数据库知识总结链接贴

系列回顾

“大白话人工智能” 系列
“数据库拍案惊奇” 系列
“世事洞明皆学问” 系列

Logo

一站式 AI 云服务平台

更多推荐