PostgreSQL10基础(6)Analyze和Vacuum

2024-02-25 04:58

本文主要是介绍PostgreSQL10基础(6)Analyze和Vacuum,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文档

  • https://www.postgresql.org/docs/10/sql-analyze.html
  • https://www.postgresql.org/docs/10/routine-vacuuming.html
  • https://www.postgresql.org/docs/10/sql-vacuum.html
  • https://www.postgresql.org/docs/10/runtime-config-autovacuum.html
  • https://www.postgresql.org/docs/10/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST

Analyze

Analyze命令用于统计数据库表数据,统计结果存储到pg_statistic系统表中。数据库进行基于成本的优化(CBO)时通过统计数据优化SQL语句的解释计划。

命令
ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
  • VERBOSE:显示处理信息
  • table_name:指定分析的表,如果未指定将分析当前数据库(逻辑库)中所有常规表、分区表、物化视图。分区表及其子表将被分析
  • column_name:指定分析的列名,可以用逗号分割多列,默认对所有列分析
权限说明
  • 表的所有者或者超级用户可以执行analyze命令
  • 数据库所有者也可以分析库中的所有表
  • 不具备权限的表将被跳过分析
影响

Analyze只需要获取一个read锁,不会影响表的正常读写。

统计量

analyze默认统计most_common_vals(最常见值)和histogram_bounds(区间内含有相似数据条数的值列表)100个

可以通过设置全局变量default_statistics_target修改统计信息量(默认值100)

可以通过alter table XX alter column XX set STATISTICS 来设置每个列的统计量,值在0-10000之间,-1表示使用default_statistics_target值

建议

大量读的数据库可以每天在低负载时运行Analyze(大量更新活动将不够频繁)

Vacuum

Vacuum用于清理死亡元组占用的存储空间,默认删除或因更新过期(为了MVVC)的元组不会被物理删除。因此需要周期性的进行Vacuum,尤其是频繁更新的表

命令
VACUUM [ ( { FULL | FREEZE | VERBOSE | ANALYZE | DISABLE_PAGE_SKIPPING } [, ...] ) ] [ table_name [ (column_name [, ...] ) ] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table_name ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table_name [ (column_name [, ...] ) ] ]
  • FULL:
    • 不加full时,Vacuum标记过期磁盘空间为可用,用于该表以后重用,但磁盘不会释放给操作系统,执行Vacuum操作不会影响表的读写。
    • 加full时,Vacuum将表数据复制到另外一块磁盘空间,负责完成后删除老的磁盘空间。老空间将被释放给操作系统,但需要足够的磁盘空间才能完成操作。且操作执行时添加exclusive lock在表上,表将无法正常读写。
  • ANALYZE:同时执行Vacuum和analyze
  • VERBOSE:显示处理信息
  • table_name:如果未指定将清扫当前数据库(逻辑库)中所有常规表、分区表、物化视图。分区表及其子表将被清扫。
  • column_name:指定分析的列名,可以用逗号分割多列,默认对所有列分析
  • FREEZE和DISABLE_PAGE_SKIPPING在此不做详细介绍
权限说明
  • 表的所有者或者超级用户可以执行vacuum命令
  • 数据库所有者也可以清扫库中的所有表
  • 不具备权限的表将被跳过清扫
影响

FULL会影响表的正常读写。

建议
  • 生产数据库建议频繁Vacuum(至少每晚)以清理死亡行。
  • 大量添加或删除行后建议进行VACUUM ANALYZE
  • FULL不建议日常使用,因为会缩表,但可以降低磁盘占用
  • Vacuum会消耗IO,可以使用基于消耗的Vacuum延迟功能
Cost-based Vacuum Delay

当执行Vacuum和analyze时,系统维护一个内部计数器记录消耗的IO。当消耗达到acuum_cost_limit时,将停止执行命令vacuum_cost_delay毫秒,然后重新计数。

此功能的目的是降低Vacuum和Analyze操作对系统的性能影响。默认功能关闭,可以设置vacuum_cost_delay大于0开启

  • vacuum_cost_delay:单位毫秒,vacuum休眠时长,默认为0,将禁用此功能。设置为大于0值将开启功能。建议设置为10或20.
  • vacuum_cost_page_hit:vacuum命中shared buffer缓存,并锁定缓存的成本,默认为1
  • vacuum_cost_page_miss:当Vacuum必须读取磁盘时的成本,默认为10
  • vacuum_cost_page_dirty: 当vacuum修改block的成本,默认20
  • vacuum_cost_limit:vacuum触发休眠的成本,默认200。

自动清理和自动分析

参数
  • autovacuum:布尔值,表示是否启用自动清扫进程,默认打开。但当track_count(默认开启)也被开启时才能启用
  • log_autovacuum_min_duration: 整型,自动扫描被记录的最少耗时(毫秒),设置为0将记录所有自动清扫操作。默认为-1,禁用日志记录。
  • autovacuum_max_workers:设置自动清扫进程的最大数量,默认为3.
  • autovacuum_naptime:设置在一个数据库上执行两次自动清扫动作的最小间隔时间,单位为秒,默认60
  • autovacuum_vacuum_threshold:设置在一张表上触发Vacuum操作的最小更新或删除元组数,默认50
  • autovacuum_analyze_threshold:设置在一张表上触发analyze操作的最小更新或删除元组数,默认50
  • autovacuum_vacuum_scale_factor:设置在一张表上触发Vacuum操作的最小变更百分比,默认0.2(表有20%的变动),可以设置系统级参数,也可以为每张表设置独立值。
  • autovacuum_analyze_scale_factor:设置在一张表上触发analyze操作的最小变更百分比,默认0.1(表有10%的变动),可以设置系统级参数,也可以为每张表设置独立值。
  • autovacuum_vacuum_cost_delay:设置基于成本的延迟,单位毫秒,如果值为-1,则使用vacuum_cost_delay值,默认为20。可以设置系统级参数,也可以为每张表设置独立值。
  • autovacuum_vacuum_cost_limit:触发延迟的成本数,默认为-1,表示使用vacuum_cost_limit值。可以设置系统级参数,也可以为每张表设置独立值。

另外自动清理还将清理事务ID,防止其超过最大值。该清理无法被关闭。

触发条件
  • autovacuum和track_count都被打开
  • 清扫条件:元组增删改数量>autovacuum_analyze_threshold + autovacuum_vacuum_scale_factor * 总元祖数
  • 自动分析条件: 元组增删改数量>autovacuum_analyze_threshold + autovacuum_analyze_scale_factor * 总元祖数
进程

数据库将自动每隔autovacuum_naptime秒在每一个逻辑库启动一个进程,但总数不能大于autovacuum_max_workers,如果有等待处理的数据库,进程将在处理完一个库后立即处理下一个。

每个进程都将检查数据库中每张表,判断是否需要执行vacuum和/或analyze

执行情况

历史执行视图pg_stat_all_tables
select relid,schemaname,relname,last_vacuum,vacuum_count,last_autovacuum,autovacuum_count,last_analyze,analyze_count,last_autoanalyze,autoanalyze_count from pg_stat_all_tables

每张表一条记录

  • last_vacuum:上次手动vacuum时间
  • vacuum_count:总计手动vacuum次数
  • last_autovacuum:上次自动vacuum时间
  • autovacuum_count:总计自动vacuum次数
  • last_analyze:上次手动analyze时间
  • analyze_count:总计手动analyze次数
  • last_autoanalyze:上次自动analyze时间
  • autoanalyze_count:总计自动analyze次数

该视图还有其他有助于性能分析的字段

  • seq_scan:顺序扫描次数
  • seq_tup_read:顺序扫描读取的存活行数
  • idx_scan:索引扫描次数
  • idx_tup_read:索引扫描读取的存活行数
  • n_tup_ins:插入的行数
  • n_tup_upd:更新的行数
  • n_tup_del:删除的行数
  • n_live_tup:存活行数
  • n_dead_tup:死亡行数
  • n_mod_since_analyze:上次分析以来修改的行数
执行过程视图pg_stat_progress_vacuum

9.6版本新增
字段说明:

  • pid:进程ID
  • datid:数据库OID
  • datname: 数据库名称
  • relid:当前Vacuum的表ID
  • phrase:处理阶段,见下文
  • heap_blks_total:表中总heap block数量
  • heap_blks_scanned:被扫描的数量,可用性视图会协助跳过一部分block
  • heap_blks_vacuumed:完成清扫的数量
  • index_vacuum_count:完成索引清扫次数
  • max_dead_tuples:执行一次索引清扫前遇到的最大死亡元组数量,基于maintenance_work_mem.
  • num_dead_tuples:上次索引清扫后找到的死亡元组数量

阶段说明

  • initializing:准备扫描heap
  • scanning heap:扫描heap,会对每个页进行修剪和整理,可能执行冻结操作。heap_blks_scanned列可以观察执行进度。如果维护内存不足,可能执行多次
  • vacuuming indexes:清扫索引。如果表有索引,将最少执行一次本动作。
  • vacuuming heap:清扫heap,每次清扫索引后进行
  • cleaning up indexes:清理索引。在所有heap扫描完成,所有索引和heap被vacuum完成后执行
  • truncating heap:缩减heap以归还处于表最后位置的空页面到操作系统。磁盘空闲将增大,但只有空页面位于最后位置才会被归还
  • performing final cleanup:执行最后的清理,此阶段将清理free space map,更新statistics视图
graph LR
初始化-->扫描堆
扫描堆-->清理索引
清理索引-->清理堆
清理堆-->扫描堆
清理堆-->最终清理索引
最终清理索引-->缩减堆
缩减堆-->清理完成

总结

通过pg_stat_all_tables视图发现默认设置下Vacuum和Analyze执行不够频繁,可以考虑定时每日清理+大量操作后清理,并通过延迟清理功能降低对生产系统性能影响

这篇关于PostgreSQL10基础(6)Analyze和Vacuum的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744452

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma