agora inbox for pgsql-zh-general@postgresql.org  
help / color / mirror / Atom feed
From: Quan Zongliang <zongliang.quan@postgresdata.com>
To: pgsql-zh-general@postgresql.org <pgsql-zh-general@postgresql.org>
Subject: 圣光照耀联盟—PostgreSQL临时表的创建与使用过程
Date: Tue, 28 Jun 2016 09:34:28 +0800
Message-ID: <c1bbd38c-dcb3-fee6-5c36-9105cc73f12c@postgresdata.com> (raw)
List-Unsubscribe:  <mailto:majordomo@postgresql.org?body=unsub%20pgsql-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.
第一次使用时才会初始化,随后再修改将不起作用。


--------------------------------------------
权宗亮


-- 
Sent via pgsql-zh-general mailing list (pgsql-zh-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-zh-general



view thread (11+ messages)  latest in thread

Message-ID: <c1bbd38c-dcb3-fee6-5c36-9105cc73f12c@postgresdata.com>
Permalink:  ../c1bbd38c-dcb3-fee6-5c36-9105cc73f12c@postgresdata.com/
Also on:    postgresql.org/message-id/c1bbd38c-dcb3-fee6-5c36-9105cc73f12c@postgresdata.com

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-zh-general@postgresql.org
  Cc: zongliang.quan@postgresdata.com
  Subject: Re: 圣光照耀联盟—PostgreSQL临时表的创建与使用过程
  In-Reply-To: <c1bbd38c-dcb3-fee6-5c36-9105cc73f12c@postgresdata.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox