postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数




/*
 * heap_vacuum_rel - Vacuum a single heap relation.
 *
 * Parameters:
 *        onerel: relation to vacuum
 *        vacuum_full: true for full VACUUM, false for lazy VACUUM
 *        do_toast: true to process the TOAST table, if any
 *        vacuum_stat: if not NULL, don't update statistics here
 *
 * Returns: the number of indexes updated.
 *
 * NOTE: if do_toast is true, then the caller should be holding an exclusive
 * lock on the relation, whereas if do_toast is false, the caller had better
 * be holding at least a Share lock on the relation to prevent other
 * backends from deleting the visible tuples out from under us.
 *
 * NOTE: this routine does not start or commit a transaction.
 */
int
heap_vacuum_rel(Relation onerel, bool vacuum_full, bool do_toast,
                VacuumStmt *vacuum_stat)
{
    int            num_index_scans = 0;
    PGRUsage    ru0;
 
    pg_rusage_init(&ru0);
 
    /* Open all indexes of the relation */
    vacuum_set_xid_limits(onerel, vacuum_full, &OldestXmin, &FreezeLimit,
                          &MultiXactCutoff, &ProcArrayOldestXmin);
    vacuum_delay_point();
 
    /*
     * Scan the relation, processing all live tuples (removing dead ones). If
     * it's a toast table, however, we don't need to process toast live
     * tuples for this.
     */
    if (!do_toast)
        num_index_scans += heap_vacuum_scan(onerel, vacuum_full, vacuum_stat);
 
    /* Open the toast relation and process it too if necessary */
    if (do_toast)
    {
        Relation    toastrel;
 
        /*
         * Even if we didn't find any indexes, we need to open the toast
         * relation to check for toast chains.
         */
        toastrel = table_open(toast_relation_id, AccessShareLock);
 
        num_index_scans += toast_vacuum_rel(toastrel, vacuum_full,
                                            vacuum_stat);
        table_close(toastrel, AccessShareLock);
    }
 
    /*
     * Done with indexes.  Now truncate off any space at the end of the heap
     * that we can.
     */
    heap_truncate(onerel);
 
    /* Update the shared free space counter */
    VacuumStmt::vacuum_stat->num_index_scans += num_index_scans;
    VacuumStmt::vacuum_stat->num_pages = RelationGetNumberOfBlocks(onerel);
    VacuumStmt::vacuum_stat->old_live_count = -1; /* not valid */
    VacuumStmt::vacuum_stat->new_live_count = -1; /* not valid */
    VacuumStmt::vacuum_stat->is_wraparound = false;
    VacuumStmt::vacuum_stat->is_full_analyze = false;
 
    /*
     * Update the relation's pg_class entry to show the new size.
     *
     * Note:

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日