既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
查看死亡元组和事务数量河相关的一些命令
#查看当前每个进程的信息
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) 有什么区别?哪个性能最好?
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
大纲路线、讲解视频,并且后续会持续更新**