Pg数据库日常维护操作指南_pg数据库维护

#查看当前每个进程的信息
SELECT * FROM pg_stat_activity;
SELECT count(*) FROM pg_stat_activity where state = ‘active’;

#当前镜像
SELECT txid_current_snapshot();

#查看死亡元组
select * from pg_stat_all_tables ORDER BY n_dead_tup limit 10;
select * from pg_stat_user_tables ORDER BY n_dead_tup limit 20;

#查看活着和死亡元组
SELECT schemaname,relname,n_live_tup,n_dead_tup, last_autovacuum, last_analyze,last_autoanalyze FROM pg_stat_user_tables where relname=‘table_name’ ORDER BY n_dead_tup;


### 分析自动清理的阈值计算


系统每隔 autovacuum\_naptime秒尝试在每个数据库中启动一个工作者,如果你有N个数据库就会有多个工作者,数据库会每隔autovacuum\_naptime/N创建一个工作者,同一时间内最多允许autovacuum\_max\_workers个工作者,工作者是一个独立的进程,并不会影响到连接数,如果数据库的数量超过了autovacuum\_max\_workers那么当一个数据库清理完成之后,会立马清理未清理的数据库,这有点像线程池哈哈。如果某个表太大占用了太多时间,导致其他表无无法清理,当其他数据库的工作者清理完之后,会来清理这个数据库的其他未清理的表,工作者会避免做重复的工作,已经被清理的表不会再次经理,对一个数据库所拥有的最大工作者数量并没有限制,简单理解这个参数是针对这个进程的,不是某个单独的数据库的,工作者进程在执行清理前会检查每个表在合适的时间执行VACUUM和ANALYZE,可以配置 log\_autovacuum\_min\_duration来监听自动清理者的工作活动。当relfrozenxid值比autovacuum\_freeze\_max\_age事务更大的表会被清理,如果废弃的元祖超过阈值表也会被清理。  
 失效的元祖数量会统计信息收集器里面获得,它是通过更新和删除命令更新的半准确的计数(它是半准确的,原因是在高负载情况下某些信息会丢失)。另一种情况是当relfrozenxid比vacuum\_freeze\_table\_age旧事务id大的时候,执行vacuum冻结表的旧元祖增加relfrozenxid,否则只对上次执行过vacuum的表进行扫描。分析阈值也是类似,该阈值将与上次被ANALYZE分析的新增删除和修改的元祖进行比较。分区表不能被自动清理,要统计和收集数据必须手动执行命令。



#清理阈值 = 清理基本阈值 + 清理缩放系数 * 元组数
vacuum threshold = vacuum base threshold + vacuum scale factor * number of tuples
#分析阈值 = 分析基本阈值 + 分析缩放系数 * 元组数
analyze threshold = analyze base threshold + analyze scale factor * number of tuples


#### 小插曲count(\*)和count(1)


很多时候我都认为count(\*)就是统计一行不展开数据直到我看到mysql文档当中写到:  
 `InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.`  
 从官网的角度来看COUNT(expr)是一个函数,参数是一个表达式,那么可以认为只要不是一个非空的数都可以,反正他是统计记录行,不是统计记录列。统计记录列还要判断是否非空,判断行就简单了,但是这是在有主键索引的情况下哈。



select proname, pronargs, prosrc from pg_proc where proname=‘count’;


如上参考的是pg的数据库count函数,意思类似,这查看函数的功能太友好了!


### 总结


知道的越多不知道的越多,即使各种数据库直接都有相通的思想和不同的实现,关于pg数据库元祖分析和事务xid冻结,请持续关注我后续博客


#### 引用


[MySQL 中 count() 和 count(1) 有什么区别?哪个性能最好?](https://bbs.csdn.net/topics/618545628)


[vacuum](https://bbs.csdn.net/topics/618545628)


[12.20.1 Aggregate Function Descriptions](https://bbs.csdn.net/topics/618545628)


[PostgreSQL的count(1)真的比count(\*)快么?](https://bbs.csdn.net/topics/618545628)


![img](https://img-blog.csdnimg.cn/img_convert/2c9a0da1a380456b8704df2c736bd3ba.png)
![img](https://img-blog.csdnimg.cn/img_convert/6f75dffd97061e69d94bab137886c564.png)
![img](https://img-blog.csdnimg.cn/img_convert/ea0ba9fd16ddf0eaf746df2e3fd35282.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值