---
title: openGauss autovacuum autoanalyze代码走读-官方技术文章-鲲鹏社区
description: 一些概念 autovacuum、autoanalyze是后台自动触发vacuum、analyze的一套逻辑，到达了什么样的条件时，自动触发vacuum与analyze。后台有常驻线程AVClauncher。这个线程每隔一定的间隔会同志PM线程来唤起一些AVCWorker线程，由AVCWorker进行实际的vacuum与analyze任务。涉及到的时间间隔、唤起的worker的数量等，都有相关的GU
keywords: Gauss,代码走读,官方技术文章,鲲鹏社区,WorkerInfoData,DatabaseList,AutoVacuumShmem,MyWorkerInfo
url: https://www.hikunpeng.com/developer/techArticles/20251124-8?envFlag=1
section: (其他)
---

# openGauss autovacuum autoanalyze代码走读-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20251124-8?envFlag=1
描述: 一些概念 autovacuum、autoanalyze是后台自动触发vacuum、analyze的一套逻辑，到达了什么样的条件时，自动触发vacuum与analyze。后台有常驻线程AVClauncher。这个线程每隔一定的间隔会同志PM线程来唤起一些AVCWorker线程，由AVCWorker进行实际的vacuum与analyze任务。涉及到的时间间隔、唤起的worker的数量等，都有相关的GU
关键词: Gauss,代码走读,官方技术文章,鲲鹏社区,WorkerInfoData,DatabaseList,AutoVacuumShmem,MyWorkerInfo

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

openGauss autovacuum autoanalyze代码走读

openGauss autovacuum autoanalyze代码走读

openGauss

发表于 2025/11/24

0

部分数据结构变量

struct WorkerInfoData:

表示一个avcworker的结构体，存放了avcworker的一些信息、工作状态等。内部有一个SHM_QUEUE，可以将一批worker连城一个双链表。

t_thrd.autovacuum_cxt.DatabaseList ：AVClauncher的一个双链表，存放了数据库列表，且顺序能表示某种时间的old?来源与pgstats相关。

t_thrd.autovacuum_cxt.AutoVacuumShmem ：一块共享内存，存放一些avc的全局信息，包括一些槽位、状态等。受AutovacuumLock保护。luncher与avcworker通过这几个槽位进行信息传递，其中主要的几个槽位有：

- av_freeWorkers：空闲的worker，是个队列。
- av_startingWorker：正在启动的worker。在这里只当成一个元素用，所以worker的启动只能是串行的，可能这样子比较安全或者实现比较简单吧。
- av_runningWorkers：正在运行的worker，是个队列。
- 
- 

t_thrd.autovacuum_cxt.MyWorkerInfo：当前worker自己的信息，存放例如正在vacuum的表。受AutovacuumScheduleLock保护。

AVClauncher 线程：AutoVacLauncherMain()

- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 

```
    AutoVacuumingActive(),如果没有开启autovcacuum或trak_count的话，则退出。
```

PM线程

- 
- 
- 

```
    信号：PMSIGNAL_START_AUTOVAC_WORKER，处理StartAutovacuumWorker（）。
```

AVCWorker线程：AutoVacWorkerMain（）

主代码

- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 

```
    启动的一些blblblb的东西
```

关键函数 relation_support_autoavac()：判断表是不是支持做autoavac

入参：pg class的一行出参：enable_analyze，enable_vacuum， is_internal_relation

- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 

```
{
```

关键函数 relation_needs_vacanalyze：判断表是不是需要做autoavac

入参：表oid、reloption、pgclass行等的信息，计数统计信息tabentry，是否支持analyze或vacuum(allowAnalyze，allowVacuum),出参：dovacuum, doanalyze, need_freeze

- autovacuum_vacuum_threshold（u_sess->attr.attr_storage.autovacuum_vac_thresh）：设置触发VACUUM的阈值。当表上被删除或更新的记录数超过设定的阈值时才会对这个表执行VACUUM操作
- autovacuum_vac_scale（u_sess->attr.attr_storage.autovacuum_vac_scale）：设置触发一个VACUUM时增加到autovacuum_vacuum_threshold的表大小的缩放系数
- autovacuum_anl_scale（u_sess->attr.attr_storage.autovacuum_anl_scale）：设置触发一个ANALYZE时增加到autovacuum_analyze_threshold的表大小的缩放系数
- autovacuum_analyze_threshold（u_sess->attr.attr_storage.autovacuum_anl_thresh）：设置触发ANALYZE操作的阈值。当表上被删除、插入或更新的记录数超过设定的阈值时才会对这个表执行ANALYZE操作。
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 

```
{
```

关键函数 partition_needs_vacanalyze：判断分区是不是需要做autoavac

- 

```
与relation_needs_vacanalyze大同小异
```
