Lists: | pgsql-zh-general |
---|
From: | Quan Zongliang <zongliang(dot)quan(at)postgresdata(dot)com> |
---|---|
To: | "pgsql-zh-general(at)postgresql(dot)org" <pgsql-zh-general(at)postgresql(dot)org> |
Subject: | 圣光照耀联盟—PostgreSQL临时表的创建与使用过程 |
Date: | 2016-06-28 01:34:28 |
Message-ID: | c1bbd38c-dcb3-fee6-5c36-9105cc73f12c@postgresdata.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-zh-general |
原文发表于
http://my.oschina.net/quanzl/blog/701657
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.
第一次使用时才会初始化,随后再修改将不起作用。
--------------------------------------------
权宗亮