文档章节

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

有理想的猪
 有理想的猪
发布于 2016/06/28 09:30
字数 397
阅读 419
收藏 0

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

© 著作权归作者所有

共有 人打赏支持
有理想的猪
粉丝 136
博文 91
码字总数 32273
作品 0
红挢
高级程序员
私信 提问
PostgreSQL安装详细步骤(windows)

PostgreSQL安装: 一、windows下安装过程 安装介质:postgresql-9.1.3-1-windows.exe(46M),安装过程非常简单,过程如下: 1、开始安装: 2、选择程序安装目录: 注:安装 PostgreSQL 的分...

引鸩怼孑
2015/04/21
0
1
科普一种可以将PG变成通用SQL引擎的技术

作者介绍 伊翼,网名“小wing”,野生PG爱好者,从事数据库相关工作已近十年,目前供职于全球最大的通讯设备供应商。 原标题:《当FDW遇上GO》 FDW(Foreign Data Wrapper)是PostgreSQL(下...

伊翼
2018/06/14
0
0
PostgreSQL DBA快速入门(四) - 体系架构

PostgreSQL在开源关系型数据库市场是最先进的数据库。他的第一个版本在1989年发布,从那时开始,他得到了很多扩展。根据db-enginers上的排名情况,PostgreSQL目前在数据库领域排名第四。 本篇...

闻术苑
2018/08/02
0
0
PostgreSQL 自动创建分区实践 - 写入触发器

标签 PostgreSQL , 自动创建分区 , 触发器 , 写入 , 动态创建分区 背景 数据写入时,自动创建分区。 目前pg_pathman这个分区插件,有这个功能,如果你不是用的这个插件,可以考虑一下用触发器...

德哥
2018/06/21
0
0
阿里云HybridDB for PG 空间紧张的解法 - 冷热分离、空间锁定、分区、压缩

标签 PostgreSQL , Greenplum , HybridDB for PG 背景 数据库空间不够用怎么办? HDB PG是分布式数据库,空间不够用,扩容呗。但是用户如果不想扩容呢?还有哪些处理方法? 例子 1 查看当前已...

德哥
2018/09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

智能合约编程/Dapp漏洞 -- 小心使用构造函数

构造函数是一个比较特殊的函数,在构造函数里会执行一些初始化合约是比较关键的功能。在Solidity 版本0.4.22之前,构造函数是一个和合约同名的函数。所以如果在开发过程中,合约名变了的话,...

怎当她临去时秋波那一转
34分钟前
2
0
JDK8发送邮件报错:Network is unreachable -- preferIPv4Stack

摘要: 使用javamail发送邮件时,老是提示Network is Network: ? 1 2 3 4 com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp. com.sun.mail.util.MailConnec......

spinachgit
41分钟前
2
0
spring cloud feign 上传文件报关于not a type supported by this encoder解决方案

转载自:https://blog.csdn.net/qq_32786873/article/details/79756720

yan_liu
52分钟前
0
0
架构的“一小步”,业务的一大步

前言: 谈到“架构”这两个字,会有好多的名词闪现,比如:分层架构、事件驱动架构、DDD、CQRS等。亦或者一堆的软件设计原则,如:KISS原则(Keep it Simple and Stupid)、SOLID原则(单一责任...

阿里云官方博客
54分钟前
1
0
倒计时

DynamicConfig Utils CustomCountDownTimer CountdownView BaseCountdown BackgroundCountdown

lsy999
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部