postgresql原理

深度解析buffer manager、index-only

什么是脏页?

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

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

1.缓冲表

2.缓冲区描述符

3.缓冲池

处理过程:

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

缓冲区标签:

/image//image-20220328112859993

读操作:

写操作:

什么是脏页?

/image//image-20220328202304517

/image//image-20220328202755772

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

/image//image-20220328202932528

/image//image-20220328204015707

/image//image-20220328204051183

/image//image-20220328204455837

/image//image-20220328204504145

/image//image-20220328204521001

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

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

/image//image-20220328205205607

/image//image-20220328210508882

锁:解决并发的问题

缓冲管理器中的五种锁:

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

/image//image-20220328205901912

buffermappingLock128个分区(默认)

/image//image-20220328132403203

IO进行锁,发生时间

/image//image-20220328210333934

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

/image//image-20220328211042611

/image//image-20220328212958015

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

/image//image-20220328213902552

什么是仅索引扫描

/image//image-20220328232438274

HOT的作用

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

/image//image-20220328232627190

/image//image-20220328232635225

/image//image-20220328232645887

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

copy协议与事务

Copy 子协议对应三种模式:

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

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

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

/image//image-20220329111721950

/image//image-20220329112025307

/image//image-20220329112055975

vacuum 原理解析

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

/image//image-20220329141037347

vacuum作用,清理分类?

/image//image-20220329142139021

1.清理死元组

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

3.analyze更新统计信息

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

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

/image//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//image-20220330150051165

理想方案:

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

ALTER TABLE test SET (autovacuum_vacuum_threshold = 100);

/image//image-20220330150802564

计算autovacuum计算

/image//image-20220330174908192

autovacuum清理过程

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

postgresql并发控制

/image//image-20220330203913767

事务标识 txid,

查看当前txid

select txid_current();

/image//image-20220330204411958

元组结构由哪几部分组成

headtupleHeaderdata:堆元组头数据

/image//image-20220330204444264

Commit Log的作用

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

PostgreSQL 定义了四种事务状态

/image//image-20220330205007116

/image//image-20220330205612781

理解事务是否活跃

/image//image-20220330205727542

freeze原理

/image//image-20220330210059905

表空间空闲率

/image//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//image-20220330210240765

/image//image-20220330224151535

/image//image-20220330224308898

/image//image-20220330210319228

/image//image-20220330224404182

/image//image-20220330224435288

/image//image-20220330224509431

/image//image-20220330210330360

/image//image-20220330224611291

Foreign Data Wrappers(外部数据包装)

FDW原理

/image//image-20220331224905393

/image//image-20220331225229197

/image//image-20220331225245174

/image//image-20220331225304947

EXPLAN查看

/image//image-20220401144530554

/image//image-20220401144605868

解决索引失效的问题

/image//image-20220401144658541

/image//image-20220401144712464

索引知识

btree

/image//image-20220401152126652

hash

/image//image-20220401152252758 gin/image//image-20220401152457032

gist

/image//image-20220401152627287

sp-gist

/image//image-20220401152644285