图解PostgreSQL-local buffer管理

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 图解PostgreSQL-local buffer管理

本文介绍local buffer管理相关机制。

一、数据结构

1、数组LocalBufferDescriptors[]为本地缓冲块的描述符,buf_id从-2开始,都是负数。为和共享缓冲区有区别,通过是否为负值就可以判断是否是本地缓冲区

2、数组大小由变量num_temp_buffers控制

3、LocalBufferBlockPointers数组为本地缓冲块的指针。这些数组的初始化由函数InitLocalBuffers完成,此时并没有分配本地缓冲块内存。

4、本地缓冲块内存的申请和分配由函数GetLocalBufferStorage完成。第一次时从内存上下文LocalBufferContext中分配16个页大小的block,然后将第一个页地址分配给LocalBufferBlockPointers[i],并不是一下子全部分配,下次使用时再分配数组下一个页。

5、16个页的block用完,再次申请32个页的block;同理32个页的block用完,申请64个页的block,每次都是之前的两倍。

6、最大一次分配1个GB的block

分配local buffer原理

1、本地buffer的分配由函数LocalBufferAlloc来完成,用于临时表的读写。

2、同样需要先初始化tagnewTag,唯一标记一个物理页

3、第一次使用临时表时,需要通过calloc创建一系列缓冲区(InitLocalBuffers完成):几个数组,大小为num_temp_buffers,即该变量控制大小。

LocalBufferDescriptors[]:存储本地缓冲块的描述符

LocalBufferBlockPointers[]:本地缓冲块指针数组,存储指向块的指针

LocalRefcount[]:每个描述符引用次数

LocalBufHash:用户管理本地缓冲块的hash表,keytagvaluebuffer的数组下标。

4、通过tagLocalBufHash表中查找,看有没有,是否已经加载到内存。

5LocalBufHash表中已存在:

  1)获取其ID,然后获取local buffer的描述符bufHdr

  2)原子操作读出bufHdrstatebuf_state

  3buf_stateusagecount保持为1refcount+1

  4bufBM_VALID,则foundPtrTRUE,表示命中缓冲,否则为false

  5)返回该描述符bufHdr

6LocalBufHash不存在:

  1)通过该值nextFreeLocalBuf遍历本地缓冲区,若超过NlocBuffer值则从头开始遍历

  2LocalRefcount对应的引用值不为0,则返回到1);否则取出其bufHdrstate

  3usagecount=0,表示没有人在用,则LocalRefcount=1后退出循环,进入步骤7

  4usagecount>0,则将usagecount-1后返回1)重新选择下一个

7buf_satateBM_DIRTY,则需要刷脏:

  1)获取具体页localpagesmgropen一个oreln,如打开checksum则计算checksum并写入localpagesmgrwrite将其写入到磁盘;最后将状态置为非BM_DIRTY

8、如果第一次使用本地buffer,则需要调用GetLocalBufferStorage将其挂到TopMemoryContext

9、如果该buffer缓冲区的数据有效,则需要更新hash表:将该tagLocalBufHash中删除,并将状态置为 ~(BM_VALID | BM_TAG_VALID),其bufHdr->tag需要清空

10、将新的tag newTag插入hashLocalBufHash

11、将bufHdr->tag替换成newTag,此时是我们的tag了。

12buf_state清空,并且置为BM_TAG_VALID,usagecount1foundPTRfalse

13、返回buf描述符bufHdr

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 固态存储 Ubuntu
postgresql email列表对NVM WAL BUFFER的讨论
postgresql email列表对NVM WAL BUFFER的讨论
67 0
|
关系型数据库 PostgreSQL
PostgreSQL ring buffer策略
PostgreSQL ring buffer策略 When running a query that needs to access a large number of pages just once,such as VACUUM or a large sequential scan, a different strategy is used.
2072 0
|
SQL 关系型数据库 PostgreSQL
hint bits 源码讲解, 为什么PostgreSQL查询语句也可能产生 xlog, 并且可能对buffer有write操作 ?
本文还可以回答另一个问题,为什么数据库开启wal_hint_log后或者使用initdb -k参数开启checksum后,产生的XLOG变多了。 PostgreSQL 查询是可能产生XLOG的,这需要从PostgreSQL tuple上的hint bits说起。什么是hint bits?你可以
3480 0
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
368 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
428 0
|
存储 算法 安全
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(下)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
387 0
|
关系型数据库 分布式数据库 开发工具