postgresql原理
深度解析buffer manager、index-only
什么是脏页?
缓冲管理器结构?1.。2.。3.。干嘛用的
作用:管理共享内存和持久存储之间的数据传输
1.缓冲表
2.缓冲区描述符
3.缓冲池
处理过程:
缓冲管理器收到请求–》缓冲区标签–》找到对应数据页面
缓冲区标签:
读操作:
写操作:
什么是脏页?
缓冲区管理器由那几个层组成
什么是自旋锁,自旋锁的优点不足?
buffer describe layer 会用到那些锁,作用是什么?
锁:解决并发的问题
缓冲管理器中的五种锁:
什么时候会获取独占模式的content_lock
buffermappingLock128个分区(默认)
IO进行锁,发生时间
描述将页面从存储加载到空槽的流程?
什么时候pg会使用环形缓冲区
什么是仅索引扫描
HOT的作用
数据库行数据更新时,索引也需要进行维护,如果是高并发的情况下,索引维护的代价 很大,可能造成索引分裂。Pg为了避免这个问题,采用了HOT(堆内元组技术)解决这 个问题
查询:共享锁 插入:独占锁
copy协议与事务
Copy 子协议对应三种模式:
copy-in:导入数据,对应命令 COPY FROM STDIN
copy-out:导出数据,对应命令 COPY TO STDOUT
copy-both:用于 walsender,在主备间批量传输数据
vacuum 原理解析
不同数据库之间历史版本怎么放的?
vacuum作用,清理分类?
1.清理死元组
2.freeze 冻结(我比谁都小,我对所用人可见的)
3.analyze更新统计信息
理解什么是FSM,什么时候生成的,有什么作用
FSM(Free Space Map),即空闲空间管理。
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%,设置阈值门槛为了避免频繁清理小表,针对大表可以调小比例因子,或者放弃比例因子调大阈值
理想方案:
据各个表的delete和update频繁程度以及表的数据量单独为每个表设置阈值:
ALTER TABLE test SET (autovacuum_vacuum_threshold = 100);
计算autovacuum计算
autovacuum清理过程
清理过程相当简单,它从数据文件中读取页面(默认8kB数据块),并检查它是否需要清理.如果没有死元组,页面就会被丢弃而不做任何更改.否则它被清理 (死元组被删除),被标记为"脏"并最终写出来。
postgresql并发控制
事务标识 txid,
查看当前txid
select txid_current();
元组结构由哪几部分组成
headtupleHeaderdata:堆元组头数据
Commit Log的作用
PostgreSQL 在Commit Log 中保存事务的状态。Commit Log,通常称为clog,分配给共享内存,并在整个事务处理过程中使用。
PostgreSQL 定义了四种事务状态
理解事务是否活跃
freeze原理
表空间空闲率
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’);