关键字:
KingbaseES、临时表、数据管理、事务机制、人大金仓
什么是临时表?
临时表(Temporary Table)是用于存放只存在于事务或会话期间数据的数据库对象,不同于普通表,临时表中的数据对会话是私有的,每个会话只能看到和修改自己的数据。
在KES中,临时表又分为局部临时表和全局临时表,二者对于数据的管理是相似的,区别主要在于元数据生命周期和可见性的不同。全局临时表的表结构在数据库系统的所有会话中均可见,并且不会随着会话的结束而消失;而局部临时表的表结构只在当前会话中可见,且生命周期与数据相同,是事务级或者会话级。
临时表的数据管理
从临时表的特点可以看出,其与普通表在DML操作上与普通表并无太大不同,主要区别点在于元数据和数据的管理上,所以我们实现要点也主要聚焦于此,我们通过观察KES系统表和物理存储路径的变化来对二者进行对比。
首先分别创建普通表tbl和局部临时表temp,观察二者的元数据信息。
从图中可以看到,与普通表类似,局部临时表也在系统表中新建了一条记录。仔细观察可以发现二者所属的namespace有所区别,进一步查询namespace信息。
查询系统表发现,KES为临时表单独创建了一个名称为”pg_temp_5”的namespace, 而普通表仍然创建到了public的namespace下。
接下来我们对比二者在物理存储上的不同。首先获取当前的数据库对象的oid, 当前oid为14457。
进入到<data_path>/base/<database_oid>路径下,可以看到tbl表和temp分别存储在不同的路径下,且局部临时表temp有额外的前缀。当创建临时表的session 退出后,发现存储临时表的文件夹t5_16407已经被清理。
临时表的事务机制
临时表和普通表一样,采用相同的事务管理机制。需要指出的是,虽然临时表数据的生命周期短于普通表,但在执行DML操作时,仍会申请实际的事务ID而不是使用虚拟的事务ID,不过临时表不会记录WAL,故此节省了不必要的存储空间和故障恢复操作。
- 开启显式事务,查询当前事务是否申请了事务ID。
从图中可以看到,执行普通表的DML和临时表的DML操作均申请了事务ID。
(2) 开启显式事务执行普通表和临时表的DML操作。(事务状态会记录WAL,故此开启显式事务控制事务状态不发生改变)
可以看到在执行普通表的DML操作时,wal的lsn已经向前推进;而操作临时表时,lsn保持不变。
总结
本文介绍了临时表的主要特点,并结合实际操作对临时表的数据管理和事务机制进行了简要的介绍,有利于读者进一步增加对KES临时表功能的认知,有助于读者结合业务的实际场景应用临时表功能,同时还有助于协助解决应用临时表过程中的一些问题。
参考资料
提供该题目相关内容在产品手册中可以系统学习的位置,例如:
《 KingbaseES数据库概念 》中“数据库对象管理”章节。