华为云云数据库GaussDBVACUUM_云淘科技

功能描述

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会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。
如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。但是对于列存表执行VACUUM操作,指定了VERBOSE选项,无信息输出。
当含有带括号的选项列表时,选项可以以任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。
VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。
VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。
简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。
VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。
时序表(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)VACUUM FULL和时序Compaction功能一致,故时序Compaction功能关闭时才可执行VACUUM FULL命令。
如果没有打开xc_maintenance_mode参数,那么VACUUM FULL会跳过所有系统表。
执行DELETE后立即执行VACUUM FULL命令不会回收空间。执行DELETE后再执行1000个非SELECT事务,或者等待1s后再执行1个事务,之后再执行VACUUM FULL命令空间才会回收。
VACUUM FULL期间会对表加排他锁,不建议在业务高峰期运行VACUUM FULL,否则会导致等锁时间过长或者死锁。
为保证性能和统计信息的准确性,避免vacuum analyze、autoanalyze、手动analyze等涉及analyze的命令同时执行或执行过于频繁。

语法格式

回收空间并更新统计信息,对关键字顺序无要求。

1
2
VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ]
    [ table_name [ (column_name [, ...] ) ] [ PARTITION ( partition_name ) ] ];

仅回收空间,不更新统计信息。

1
VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name [ PARTITION ( partition_name ) ] ];

回收空间并更新统计信息,且对关键字顺序有要求。

1
2
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] 
    [ table_name [ (column_name [, ...] ) ] [ PARTITION ( partition_name ) ] ];

参数说明

FULL

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

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

FREEZE

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

VERBOSE

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

ANALYZE | ANALYSE

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

table_name

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

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

column_name

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

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

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

PARTITION

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

partition_name

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

DELTAMERGE

只针对列存表,将列存表的delta table中的数据转移到主表存储上。对列存表而言,此操作受GUC参数enable_delta_store和参数说明中的deltarow_threshold控制。

为了检查列存delta表中的信息,提供下述DFX函数,用于获取某个列存表的delta表中数据存储情况:

pgxc_get_delta_info(TEXT),传入参数为列存表名,搜集并显示各个节点上的对应delta表信息,包括当前存活tuple数量、表大小、使用的最大block ID。
get_delta_info(TEXT),传入参数为列存表名,汇总pgxc_get_delta_info得到的结果,返回其delta表整体的当前存活tuple数量、表大小、使用的最大block ID。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--创建SCHEMA。
gaussdb=# CREATE SCHEMA tpcds;

--创建表tpcds.reason。
gaussdb=# CREATE TABLE tpcds.reason(
  r_reason_sk      integer,
  r_reason_id      character(16),
  r_reason_desc    character(100)
);

--向表中插入多条记录。
gaussdb=# INSERT INTO tpcds.reason values(1,'AAAAAAAABAAAAAAA','reason 1'),(2,'AAAAAAAABAAAAAAA','reason 2');

--在表tpcds.reason上创建索引。
gaussdb=# CREATE UNIQUE INDEX ds_reason_index1 ON tpcds.reason(r_reason_sk);

--对带索引的表tpcds.reason执行VACUUM操作。
gaussdb=# VACUUM (VERBOSE, ANALYZE) tpcds.reason;

--删除索引。
gaussdb=# DROP INDEX ds_reason_index1 CASCADE;
gaussdb=# DROP TABLE tpcds.reason;
gaussdb=# DROP SCHEMA tpcds CASCADE;

优化建议

vacuum

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

父主题: SQL语法

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家