---
title: openGauss vacuum analyze代码走读-官方技术文章-鲲鹏社区
description: 一些概念   vacuum、analyze在很多流程上是公用的，主要是analyze用了vacuum的很多流程，包括语法树主要结构体VacuumStmt，主要流程操作函数vacuum()等。    vacuum、analyze可以手动以SQL的形式触发，也可以通过autovacuum、autoanalyze进行自动触发。
keywords: Gauss,代码走读,官方技术文章,鲲鹏社区,TableRelationVacuum,VacAttrStats,Relation,了解详情
url: https://www.hikunpeng.com/developer/techArticles/20251124-7?envFlag=1
section: (其他)
---

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

URL: https://www.hikunpeng.com/developer/techArticles/20251124-7?envFlag=1
描述: 一些概念   vacuum、analyze在很多流程上是公用的，主要是analyze用了vacuum的很多流程，包括语法树主要结构体VacuumStmt，主要流程操作函数vacuum()等。    vacuum、analyze可以手动以SQL的形式触发，也可以通过autovacuum、autoanalyze进行自动触发。
关键词: Gauss,代码走读,官方技术文章,鲲鹏社区,TableRelationVacuum,VacAttrStats,Relation,了解详情

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

openGauss vacuum analyze代码走读

openGauss vacuum analyze代码走读

openGauss

发表于 2025/11/24

0

触发流程入口

SQL语句触发主要流程

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

```
   语法分析中创建出结构体VacuumStmt。
```

autovacuum触发流程

- 

```
AVCWorker线程执行，直接调用 vacuum() 函数，对某一张特定的表进行分析或整理。

```

可参考：openGauss autovacuum autoanalyze代码走读 [了解详情](http://mp.weixin.qq.com/s?__biz=MzIyMDE3ODk1Nw==&mid=2247514914&idx=1&sn=7194cf4bd8487a3f64e223dc5a96e8cf&chksm=97cd0440a0ba8d56bdb44f36f04802b12eab027173bb2efa8ddcde61264a52050151739f38ed&scene=21#wechat_redirect)

主要操作函数 vacuum()

可以被语句调用，也会被avc调用。入参：stmt， 表oid， 要不要搞toast，buffer使用策略

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

```
函数走读伪代码：
```

关键函数：vacuum_rel(), 对一个关系做vacuum操作

VACOPT_NOWAIT：取锁时不等待，只有avc才是true.

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

```
    一些事务的操作，一些检查等。
```

子函数 cluster_rel()：对普通表做vacuum full

cluster是顺序聚簇操作，将元组按照某个索引的顺序聚簇，并重建整个表以及索引。因此vacuum full是cluster的一个简化版，不需要排序，仅是重建。重建原理过程比较简单。新建一个heap，然后遍历老heap，将元组堆积就好了。

但是需要注意，元组之间存在hot、ctid链，这些链不能破坏，因此在重建期间会有几个hash表，用于存放扫描到的映射关系，来建立这些元组间指针。

由于加的是八级锁，也不需要担心并发访问问题，先重建表，然后重建索引即可。

子函数 TableRelationVacuum()->lazy_vacuum_rel()：大部份表的vacuum

适用范围：普通表、分区一些概念：lazy vacuum 会启动一个事物，但不会在任何页面上写自己的事务号。包括更新pg_class内相关数据的时候，都不会写自己的事务号，这可能与系统表的扫描snapshot相关。

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

```
    
```

关键函数 analyze_rel()：对一个关系做analyze操作

analyze相对于vacuum来说比较简单。

相关数据结构：

struct VacAttrStats：统计采样分析算法的计算上下文。用在对某一列进行统计算法计算的时候，存储这列的数据类型、各种统计信息计算算法的中间变量数据、结果等。

主要代码

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

```
    Relation onerel = analyze_get_relation(relid, vacstmt);  打开需要analyze的表
```

其他函数 vacuum_delay_point()：控制vacuum速度

控制vacuum速度的东西，还和几个vacuum cost、delay等参数有关。函数存在于vacuum流程中的各个点。
