PostgreSQL码农集散地

为什么经常使用临时表时建议使用全局临时表?

文章开始前推荐2个学习环境: 

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能:《最好的PostgreSQL学习镜像》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库》

3、PolarDB开源数据库内核、应用等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

为什么经常使用临时表时建议使用全局临时表?

https://www.bilibili.com/video/BV13q4y1C7p2/

临时表通常被用于处理临时数据, 而且不希望被其他会话查看或修改, 并且可能有多个会话同时用到同一套临时表.

社区版本:
在一个会话中使用本地临时表时, 需要先创建本地临时表的结构, 会话退出后自动删除.
不同的会话在同一时间段可以使用同名的本地临时表, 本地临时表的结构也不必要一致.
缺点:
1、每次使用需要先创建
2、退出会话后自动删除, 临时表结构存储在数据库系统表(至少在pg_class, pg_attribute), 一创建一删除导致系统表产生垃圾记录. 如果临时表使用频率较高, 并且由于长事务等原因导致垃圾回收不及时, 系统表将膨胀, 影响性能.

  • 特别注意老版本的greenplum, 没有自动垃圾 回收的话, 更加容易膨胀, 而且临时表通常比较匹配分析型场景的中间结果保存.

PolarDB:
1、增加支持global temp table(全局临时表)功能. 创建一次, 多次使用. 但是每个会话看到的临时表结构是一样的(当然个人认为不同会话要求临时表同名而且结构不同的场景非常少, 所以这个问题基本不存在.).

本期问题1:
以下哪些原因是使用PG本地临时表会导致系统表膨胀的原因?

  • a. 每次使用本地临时表的会话退出后会自动删除本地临时表的结构定义

  • b. 使用临时表之前每次都需要创建临时表结构

  • c. 每次使用全局临时表的会话退出后会自动删除全局临时表的结构

  • d. 没有及时清理掉系统表里存储的本地临时表结构定义的垃圾记录

答案:

  • abd

解释:

  • 参考本文内容

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

Image

文章中的参考文档请点击阅读原文获得.