深度解析buffer manager、index-only

深度解析buffer manager、index-only

什么是脏页?

缓冲管理器结构?1.。2.。3.。干嘛用的

作用:管理共享内存和持久存储之间的数据传输

1.缓冲表

2.缓冲区描述符

3.缓冲池

处理过程:

缓冲管理器收到请求–》缓冲区标签–》找到对应数据页面

缓冲区标签:

image-20220328112859993

读操作:

写操作:

什么是脏页?

image-20220328202304517

image-20220328202755772

缓冲区管理器由那几个层组成

image-20220328202932528

image-20220328204015707

image-20220328204051183

image-20220328204455837

image-20220328204504145

image-20220328204521001

什么是自旋锁,自旋锁的优点不足?

buffer describe layer 会用到那些锁,作用是什么?

image-20220328205205607

image-20220328210508882

锁:解决并发的问题

缓冲管理器中的五种锁:

什么时候会获取独占模式的content_lock

image-20220328205901912

buffermappingLock128个分区(默认)

image-20220328132403203

IO进行锁,发生时间

image-20220328210333934

描述将页面从存储加载到空槽的流程?

image-20220328211042611

image-20220328212958015

什么时候pg会使用环形缓冲区

image-20220328213902552

什么是仅索引扫描

image-20220328232438274

HOT的作用

数据库行数据更新时,索引也需要进行维护,如果是高并发的情况下,索引维护的代价 很大,可能造成索引分裂。Pg为了避免这个问题,采用了HOT(堆内元组技术)解决这 个问题

image-20220328232627190

image-20220328232635225

image-20220328232645887

查询:共享锁 插入:独占锁

copy协议与事务

Copy 子协议对应三种模式:

copy-in:导入数据,对应命令 COPY FROM STDIN

copy-out:导出数据,对应命令 COPY TO STDOUT

copy-both:用于 walsender,在主备间批量传输数据

image-20220329111721950

image-20220329112025307

image-20220329112055975

vacuum 原理解析

不同数据库之间历史版本怎么放的?

image-20220329141037347

vacuum作用,清理分类?

image-20220329142139021

1.清理死元组

2.freeze 冻结(我比谁都小,我对所用人可见的)

3.analyze更新统计信息

理解什么是FSM,什么时候生成的,有什么作用

FSM(Free Space Map),即空闲空间管理。

image-20220330110433077

https://blog.csdn.net/weixin_39540651/article/details/100933665

什么 时候会触发autovacuum

每当死亡元组(dead tuple)超过以下公式时,就会触发自动清理

autovacuum_vacuum_threshold(门槛) + pg_class.reltuples (表上记录数)*autovacuum_vacuum_scale_factor(比例因子

死亡元组数可以认为是pg_stat_all_tables中n_dead_tup的值

门槛默认为50,比例因子默认为0.2,就是20%,设置阈值门槛为了避免频繁清理小表,针对大表可以调小比例因子,或者放弃比例因子调大阈值

image-20220330150051165

理想方案:

据各个表的delete和update频繁程度以及表的数据量单独为每个表设置阈值:

ALTER TABLE test SET (autovacuum_vacuum_threshold = 100);

image-20220330150802564

计算autovacuum计算

image-20220330174908192

autovacuum清理过程

清理过程相当简单,它从数据文件中读取页面(默认8kB数据块),并检查它是否需要清理.如果没有死元组,页面就会被丢弃而不做任何更改.否则它被清理 (死元组被删除),被标记为"脏"并最终写出来。

postgresql并发控制

image-20220330203913767

事务标识 txid,

查看当前txid

select txid_current();

image-20220330204411958

元组结构由哪几部分组成

headtupleHeaderdata:堆元组头数据

image-20220330204444264

Commit Log的作用

PostgreSQL 在Commit Log 中保存事务的状态。Commit Log,通常称为clog,分配给共享内存,并在整个事务处理过程中使用。

PostgreSQL 定义了四种事务状态

image-20220330205007116

image-20220330205612781

理解事务是否活跃

image-20220330205727542

freeze原理

image-20220330210059905

表空间空闲率

image-20220330210231473

SELECT count(*) as “number of pages”,pg_size_pretty(cast(avg(avail) as bigint)) as “Av. freespace size”,round(100 * avg(avail)/8192 ,2) as “Av. freespace ratio” FROM pg_freespace(’test’);

SELECT *, round(100 * avail/8192 ,2) as “freespace ratio” FROM pg_freespace(’test’);

image-20220330210240765

image-20220330224151535

image-20220330224308898

image-20220330210319228

image-20220330224404182

image-20220330224435288

image-20220330224509431

image-20220330210330360

image-20220330224611291

Foreign Data Wrappers(外部数据包装)

FDW原理

image-20220331224905393

image-20220331225229197

image-20220331225245174

image-20220331225304947

EXPLAN查看

image-20220401144530554

image-20220401144605868

解决索引失效的问题

image-20220401144658541

image-20220401144712464

索引知识

btree

image-20220401152126652

hash

image-20220401152252758 gin image-20220401152457032

gist

image-20220401152627287

sp-gist

image-20220401152644285

wal记录

数据先到wal buffer–>在落盘保证数据 lsn不断放大的号,确保回放,把最新的lsn,从上一次检查点重放 保证数据库不丢数据 是如何恢复的 重放xlog从磁盘到wal buffer ,redo poin它中有lsn号,去和shared buffer中的lsn做对比,大的就回放 块折断 full_page_writes作用:是否开启全页写入,为了防止块折断(块损坏)的一种策略 判断:checksum值 采用机制:在checkponit后的一个块第一次变脏后就要整块写入到wal日志中, 后续修改这个块,只要把修改信息写入到wal日志 断电重启,有块折断, 则在全页写入的块为基础进行恢复 最后覆盖磁盘上的折断块 参数checkpoint_segments对checkpoint影响 作用:控制checkpoint的间隔 过大:恢复时间会变长 过小:造成频繁的checkpoint进而导致写入了过多的全页,可能wal日志暴增 检查点作用 1.将事务提交的修改写进disk(写脏数据);保证数据库的完整性和一致性。 2.缩短恢复时间,将脏页写入相应的数据文件,确保修改后的文件通过fsync()写入到磁盘。 触发条件: 1、checkpoint_timeout设置时间 2、为checkpoint_segments设置的 WAL 段文件的数量自上一个检查点以来已经被消耗(默认3) 3、WAL 段文件的总大小已超过参数max_wal_size的值(默认值为 1GB(64 个文件)) 4、PostgreSQL 服务器在smart或fast模式下停止 5、手动执行CHECKPOINT 6、写入WAL的数据量已达到参数max_wal_size(默认值:1GB) 7、执行pg_start_backup函数时 8、在进行数据库配置时

pg_control文件

包含检查点的基本信息,如果损坏或无法读取,则无法启动恢复过程,从而无法获得起点。

WAL段切换 1、wal段文件被写满 2、函数pg_switch——wal()被调用 3、启用了archive_mode,且已经超过archive_timeout配置的超时时间。 archive_timeout时间短会导致空间膨胀