postgresql数据库 查询慢的原因之一(死元祖太多) postgresql表清理收缩

postgresql数据库 查询慢的原因之一(死元祖太多问题) postgresql表清理收缩

文章目录

  • postgresql数据库 查询慢的原因之一(死元祖太多问题) postgresql表清理收缩
  • 前言
  • 一、元组是什么?
  • 二、postgresql的解决方法
    • 自动清理
      • 自动清理相关参数
      • 2.查询当前正在进行自动清理的表及相关信息
      • 3、查询自动清理的历史统计信息
    • 手动清理
      • 数据表收缩
  • 总结


前言

在使用postgresql数据库时,有时往往会发现有时候查询速度非常慢,以往十几秒就查询出来的,结果需要20多秒才行,看了看发现没有锁,这时候一般都是表的死元祖太多导致的。


我们知道postgresql数据库通过数据多版本实现mvcc,pg又没有undo段,老版本的数据元组直接存放在数据页面中,这样带来的问题就是旧元组需要不断地进行清理以释放空间,这也是数据库膨胀的根本原因

一、元组是什么?

元组,也叫tuple,这个叫法是很学术的叫法,但是现在数据库中一般叫行或者记录。

二、postgresql的解决方法

在postgresql数据库中既可以手动去清理。也可以运用自动清理参数

自动清理

自动清理相关参数

在PostgreSQL数据库系统配置文件中,与系统自动清理相关的主要相关参数如下:
autovacuum:是否启动系统自动清理功能,默认值为on。
autovacuum_max_workers:设置系统自动清理工作进程的最大数量。
autovacuum_naptime:设置两次系统自动清理操作之间的间隔时间。
autovacuum_vacuum_threshold和autovacuum_analyze_threshold:设置当表上被更新的元组数的阈值超过这些阈值时分别需要执行vacuum和analyze。
autovacuum_vacuum_scale_factor和autovacuum_analyze_scale_factor:设置表大小的缩放系数。
autovacuum_freeze_max_age:设置需要强制对数据库进行清理的XID上限值。


### 1.查询元祖 和那些表需要清理 查询当前数据库表已经达到自动清理条件的表及相关信息
SELECT
    c.relname 表名,
    (current_setting('autovacuum_analyze_threshold')::NUMERIC(12,4))+(current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12,4))

你可能感兴趣的:(postgresql,postgresql,数据库)