加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

圣光照耀联盟—PostgreSQL临时表的创建与使用过程

发布时间:2020-12-13 17:05:33 所属栏目:百科 来源:网络整理
导读:1、临时表的创建与普通表没什么区别,都是通过DefineRelation 函数(定义于 src/backend/commands/tablecmds.c),临时表具有属性relation-relpersistence == RELPERSISTENCE_TEMP #define RELPERSISTENCE_PERMANENT'p'/* regular table */#define RELPERSIS

1、临时表的创建与普通表没什么区别,都是通过DefineRelation 函数(定义于 src/backend/commands/tablecmds.c),临时表具有属性relation->relpersistence == RELPERSISTENCE_TEMP

#define		  RELPERSISTENCE_PERMANENT	'p'		/* regular table */
#define		  RELPERSISTENCE_UNLOGGED	'u'		/* unlogged permanent table */
#define		  RELPERSISTENCE_TEMP		't'		/* temporary table */

2、首先为临时表创建临时schema,命名为"pg_temp_%d",MyBackendId,也就是以客户端后台进程的PID为后缀,保证各进程不冲突。(消耗 OID)
函数InitTempTableNamespace定义于src/backend/catalog/namespace.c

3、随后的创建过程与普通表区别不大,仍然消耗 OID

4、我们直接跳到缓存的分配看:

bool		isLocalBuf = SmgrIsTemp(smgr);
if (isLocalBuf)
	{
		bufHdr = LocalBufferAlloc(smgr,forkNum,blockNum,&found);
		if (found)
			pgBufferUsage.local_blks_hit++;
		else
			pgBufferUsage.local_blks_read++;
	}

这里 isLocalBuf 就是临时表的意思

#define SmgrIsTemp(smgr) 
	RelFileNodeBackendIsTemp((smgr)->smgr_rnode)
/*
 * Augmenting a relfilenode with the backend ID provides all the information
 * we need to locate the physical storage.  The backend ID is InvalidBackendId
 * for regular relations (those accessible to more than one backend),or the
 * owning backend's ID for backend-local relations.  Backend-local relations
 * are always transient and removed in case of a database crash; they are
 * never WAL-logged or fsync'd.
 */
typedef struct RelFileNodeBackend
{
	RelFileNode node;
	BackendId	backend;
} RelFileNodeBackend;

5、临时表缓存

if (LocalBufHash == NULL)
		InitLocalBuffers();

这里就是文档Chapter 18. Server Configuration,18.4.1. Memory 里边关于temp_buffers 的说明:The setting can be changed within individual sessions,but only before the first use of temporary tables within the session; subsequent attempts to change the value will have no effect on that session.
第一次使用时才会初始化,随后再修改将不起作用。

-------------------------------------------- 权宗亮 神州飞象(北京)数据科技有限公司 我们的力量源自最先进的开源数据库PostgreSQL zongliang.quan@postgresdata.com

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读