圣光照耀联盟—PostgreSQL临时表的创建与使用过程
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) 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |