计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
弹性伸缩 AS
镜像服务 IMS
专属主机 DeH
函数工作流 FunctionGraph
云手机服务器 CPH
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
虚拟专用网络 VPN
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
VPC终端节点 VPCEP
云连接 CC
企业路由器 ER
企业交换机 ESW
全球加速 GA
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
边缘安全 EdgeSec
威胁检测服务 MTD
CDN与智能边缘
内容分发网络 CDN
CloudPond云服务
智能边缘云 IEC
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
云搜索服务 CSS
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
数据可视化 DLV
数据湖工厂 DLF
湖仓构建 LakeFormation
企业应用
云桌面 Workspace
应用与数据集成平台 ROMA Connect
云解析服务 DNS
专属云
专属计算集群 DCC
IoT物联网
IoT物联网
设备接入 IoTDA
智能边缘平台 IEF
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
国际站常见问题
ICP备案
我的凭证
支持计划
客户运营能力
合作伙伴支持计划
专业服务
区块链
区块链服务 BCS
Web3节点引擎服务 NES
解决方案
SAP
高性能计算 HPC
视频
视频直播 Live
视频点播 VOD
媒体处理 MPC
实时音视频 SparkRTC
数字内容生产线 MetaStudio
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
存储容灾服务 SDRS
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属分布式存储服务 DSS
容器
云容器引擎 CCE
容器镜像服务 SWR
应用服务网格 ASM
华为云UCS
云容器实例 CCI
管理与监管
云监控服务 CES
统一身份认证服务 IAM
资源编排服务 RFS
云审计服务 CTS
标签管理服务 TMS
云日志服务 LTS
配置审计 Config
资源访问管理 RAM
消息通知服务 SMN
应用运维管理 AOM
应用性能管理 APM
组织 Organizations
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
应用身份管理服务 OneAccess
数据库
云数据库 RDS
文档数据库服务 DDS
数据管理服务 DAS
数据复制服务 DRS
云数据库 GeminiDB
云数据库 GaussDB
分布式数据库中间件 DDM
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
人脸识别服务 FRS
图引擎服务 GES
图像识别 Image
内容审核 Moderation
文字识别 OCR
AI开发平台ModelArts
图像搜索 ImageSearch
对话机器人服务 CBS
华为HiLens
视频智能分析服务 VIAS
语音交互服务 SIS
应用中间件
分布式缓存服务 DCS
API网关 APIG
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
多活高可用服务 MAS
事件网格 EG
企业协同
华为云会议 Meeting
云通信
消息&短信 MSGSMS
云生态
合作伙伴中心
云商店
开发者工具
SDK开发指南
API签名指南
Terraform
华为云命令行工具服务 KooCLI
其他
产品价格详情
系统权限
管理控制台
客户关联华为云合作伙伴须知
消息中心
公共问题
开发与运维
应用管理与运维平台 ServiceStage
软件开发生产线 CodeArts
需求管理 CodeArts Req
部署 CodeArts Deploy
性能测试 CodeArts PerfTest
编译构建 CodeArts Build
流水线 CodeArts Pipeline
制品仓库 CodeArts Artifact
测试计划 CodeArts TestPlan
代码检查 CodeArts Check
代码托管 CodeArts Repo
云应用引擎 CAE
开天aPaaS
云消息服务 KooMessage
云手机服务 KooPhone
云空间服务 KooDrive

VACUUM

更新时间:2024-08-20 GMT+08:00

功能描述

VACUUM回收表或B-Tree索引中已经删除的行所占据的存储空间。在一般的数据库操作里,那些已经DELETE的行并没有从它们所属的表中物理删除;在完成VACUUM之前它们仍然存在。因此有必要周期地运行VACUUM,特别是在经常更新的表上。

注意事项

  • 如果没有参数,VACUUM处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,VACUUM只处理指定的表。
  • 要对一个表进行VACUUM操作,通常用户必须是表的所有者或者被授予了指定表VACUUM权限的用户,三权分立开关关闭时,默认系统管理员有该权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行VACUUM操作(该限制意味着只有系统管理员才能真正对一个数据库进行VACUUM操作)。VACUUM命令会跳过那些用户没有权限的表进行垃圾回收操作。
  • VACUUM不能在事务块内执行。
  • 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的习惯。这样将更新系统目录为最近的更改,并且允许查询优化器在规划用户查询时有更好地选择。
  • 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL通常要比单纯的VACUUM收缩更多的表尺寸。FULL选项并不清理索引,所以推荐周期性的运行REINDEX命令。如果执行此命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有等其他活跃事务退出进行重试。
  • VACUUM FULL通过重建表的方式将表内空闲空间归还给表空间,重建过程需要额外申请表中有效数据相当的存储空间。对于非段页式表,VACUUM FULL执行结束后,原表所占物理文件会被删除,原表所占的物理文件的空间会归还给操作系统;对于段页式表,VACUUM FULL执行结束后,原表所占的物理空间,会被归还给段页式数据文件,不会归还给操作系统。
  • VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。
  • 如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。
  • 当含有带括号的选项列表时,选项可以以任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。
  • VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。
  • VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。
  • 简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。
  • 同时执行多个VACUUM FULL可能出现死锁。
  • 如果没有打开xc_maintenance_mode参数,那么VACUUM FULL操作将跳过所有系统表。
  • 执行DELETE后立即执行VACUUM FULL命令不会回收空间。执行DELETE后再执行1000个非SELECT事务,或者等待1s后再执行1个事务,之后再执行VACUUM FULL命令空间才会回收。
  • VACUUM FULL期间会对表加排他锁,不建议在业务高峰期运行VACUUM FULL,可能导致等待时间过长或者业务中断。
  • Ustore手动VACUUM与Astore手动VACUUM行为一致、会对堆表、索引等进行加锁清理;而Ustore的AUTOVACUUM仅做分区表GPI清理、堆表FSM更新以及索引页面回收。
  • VACUUM FULL分区表时,会遍历分区进行清理,并在分区清理后重建GPI,因此当分区较多时,建议先删除GPI,在VACUUM FULL执行完成后重新创建索引,以此降低VACUUM FULL的执行时间。

语法格式

  • 回收空间并更新统计信息,对关键字顺序无要求。
    VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ]
        [ table_name [ (column_name [, ...] ) ] [ PARTITION ( partition_name ) | SUBPARTITION ( subpartition_name ) ] ];
  • 仅回收空间,不更新统计信息。
    VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name 
    [ PARTITION ( partition_name )  | SUBPARTITION ( subpartition_name ) ] ];
  • 回收空间并更新统计信息,且对关键字顺序有要求。
    VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] 
        [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
  • 仅回收指定bucket的空间,更新pg_hashbucket系统表的bucketxid列,不更新统计信息。当前版本暂不支持。
    1
    VACUUM FREEZE BUCKETS (bucketid [, ...]);
    

参数说明

  • FULL

    选择“FULL”清理,这样可以恢复更多的空间,但是需要耗时更多,并且在表上施加了排他锁。

    说明:

    使用FULL参数会导致统计信息丢失,如果需要收集统计信息,请在VACUUM FULL语句中加上analyze关键字。

  • FREEZE

    指定FREEZE相当于执行VACUUM时将vacuum_freeze_min_age参数设为0。

  • VERBOSE

    为每个表打印一份详细的清理工作报告。

  • ANALYZE | ANALYSE

    更新用于优化器的统计信息,以决定执行查询的最有效方法。

    说明:

    ustore分区表在autovacuum=analyze的时候也会触发vacuum。

  • table_name

    要清理的表的名称(可以有模式修饰)。

    取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。

  • column_name

    要分析的具体的字段名称,需要配合analyze选项使用。

    取值范围:要分析的具体的字段名称。缺省时为所有字段。

    说明:

    由于VACUUM ANALYZE语句的机制是依次执行VACUUM和ANALYZE,因此当column_name错误时,会存在VACUUM执行成功但ANALYZE执行失败的情况;对于分区表,则会出现对某个分区VACUUM执行成功之后ANALYZE执行失败的情况。

  • PARTITION

    COMPACT和PARTITION参数不能同时使用。

  • partition_name

    要清理的表的一级分区名称。缺省时为所有一级分区。

  • subpartition_name

    要清理的表的二级分区名称。缺省时为所有二级分区。

示例

  • VACUUM
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    --创建表tbl_test,并插入数据。
    gaussdb=# CREATE TABLE tbl_test(c1 int); 
    gaussdb=# INSERT INTO tbl_test VALUES (1); 
    
    --查看数据,和数据的ctid。
    gaussdb=# SELECT ctid,* FROM tbl_test;
     ctid  | c1 
    -------+----
     (0,1) |  1
    (1 row)
    
    --删除该数据。
    gaussdb=# DELETE FROM tbl_test;
    
    --重新插入一条数据,发现使用了一个新的ctid。
    gaussdb=# INSERT INTO tbl_test VALUES (2);
    gaussdb=# SELECT ctid,* FROM tbl_test;
     ctid  | c1 
    -------+----
     (0,2) |  2
    (1 row)
    
    --使用VACUUM命令之后,在插入数据,发现复用了旧的空间。
    gaussdb=# VACUUM ANALYZE tbl_test;
    gaussdb=# INSERT INTO tbl_test VALUES (3);
    gaussdb=# SELECT ctid,* FROM tbl_test;
     ctid  | c1 
    -------+----
     (0,1) |  3
     (0,2) |  2
    (2 rows)
    
    --删除表。
    gaussdb=# DROP TABLE tbl_test;
    
  • VACUUM FULL
    --建表。
    gaussdb=# CREATE TABLE tbl_test2(c1 int);
    
    --插入10万条数据并查看表的大小。
    gaussdb=# INSERT INTO tbl_test2 VALUES (generate_series(1,100000));
    gaussdb=# SELECT 'tbl_test2' AS tablename, pg_size_pretty(pg_relation_size('tbl_test2')) AS size;
     tablename |  size   
    -----------+---------
     tbl_test2 | 3048 kB
    (1 row)
    
    --删除数据并查看表大小。
    gaussdb=# DELETE FROM tbl_test2;
    gaussdb=# SELECT 'tbl_test2' AS tablename, pg_size_pretty(pg_relation_size('tbl_test2')) AS size;
     tablename |  size   
    -----------+---------
     tbl_test2 | 3048 kB
    (1 row)
    
    --使用VACUUM FULL回收空间,并查看表的大小。
    gaussdb=# VACUUM FULL ANALYZE tbl_test2;
    gaussdb=# SELECT 'tbl_test2' AS tablename, pg_size_pretty(pg_relation_size('tbl_test2')) AS size;
     tablename |  size   
    -----------+---------
     tbl_test2 | 0 bytes
    (1 row)
    
    
    --删除。
    gaussdb=# DROP TABLE tbl_test2;

优化建议

  • VACUUM
    • VACUUM不能在事务块内执行。
    • 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录后,对相关表执行VACUUM ANALYZE命令。
    • 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如,一个例子就是在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。

我们使用cookie来确保您的高速浏览体验。继续浏览本站,即表示您同意我们使用cookie。 详情

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容