postgresql 中buffer操作

 74ac905cfa3740079f2f66a445a3d7c2.gif#pic_center


目录

前言

概述

接口介绍

结尾


前言

本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。


概述

在postgresql中,SQL引擎使用表文件中的数据时,先读入共享缓冲区,修改时也先在缓冲区进行修改,而后通过缓冲区替换算法,定时脏页落盘等机制将数据写入磁盘。共享缓冲区是由buffer数组构成,每一个buffer对应数据文件中的一个page,默认配置时就是8K。

前面介绍过缓冲区替换算法及查找流程,本文对查找接口进行分享介绍。

接口介绍

在postgresql 主要有六种查找buffer的接口,分别在不同场景下,以提升性能。

extern PrefetchBufferResult PrefetchSharedBuffer(struct SMgrRelationData *smgr_reln,

 ForkNumber forkNum,

 BlockNumber blockNum);

extern PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum,

   BlockNumber blockNum);

extern bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum,

 BlockNumber blockNum, Buffer recent_buffer);


extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);

extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum,

 BlockNumber blockNum, ReadBufferMode mode,

 BufferAccessStrategy strategy);

extern Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator,

ForkNumber forkNum, BlockNumber blockNum,

ReadBufferMode mode, BufferAccessStrategy strategy,

bool permanent);

调用场景分析:

ReadBuffer

最简单的调用,对于普通表常用,因为只能MAIN_FORKNUM,默认访问策略,也就是NULL

ReadBufferExtended

比较灵活,可以指定forknum, mode, strategy,

ReadBufferWithoutRelcache

一般在拷贝database或table,replay wal时调用

ReadRecentBuffer

主要在replay wal时调用,与ReadBuffer相比,此接口不会去查buffer mapping hash

PrefetchBuffer

在lazyvacuum时调用,扫描表的尾部的pages

PrefetchSharedBuffer

在PrefetchBuffer会调用;此外在replay wal时调用,提前加载WAL涉及的buffer来加速


结尾

作者邮箱:[email protected]
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

猜你喜欢

转载自blog.csdn.net/senllang/article/details/129892305
今日推荐