KES V8R6 VACUUM

17.202. VACUUM

VACUUM — 垃圾收集并根据需要分析一个数据库

17.202.1. 概述

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

其中option可以是下列之一:

    FULL [ boolean ]
    FREEZE [ boolean ]
    VERBOSE [ boolean ]
    ANALYZE [ boolean ]
    DISABLE_PAGE_SKIPPING [ boolean ]
    SKIP_LOCKED [ boolean ]
    INDEX_CLEANUP [ boolean ]
    TRUNCATE [ boolean ]

而table_and_columns是:

    table_name [ ( column_name [, ...] ) ]

17.202.2. 描述

VACUUM收回由死亡元组占用的存储空间。在通常的KingbaseES操作中,被删除或者被更新废弃的元组并没有在物理上从它们的表中移除,它们将一直存在直到一次VACUUM被执行。因此有必要周期性地做VACUUM,特别是在频繁被更新的表上。

在没有``table_and_columns``列表的情况下,VACUUM会处理当前用户具有清理权限的当前数据库中的每一个表和物化视图。如果给出一个列表,VACUUM可以只处理列表中的那些表。

VACUUM ANALYZE对每一个选定的表ANALYZE。这是两种命令的一种方便的组合形式,可以用于例行的维护脚本。其处理细节可参考 ANALYZE

简单的``VACUUM``(不带FULL)简单地收回空间并使其可以被重用。这种形式的命令可以和表的普通读写操作并行,因为它不会获得一个排他锁。但是,这种形式中额外的空间并没有被还给操作系统(在大多数情况下),它仅仅被保留在同一个表中以备重用。VACUUM FULL将表的整个内容重写到一个新的磁盘文件中,并且不包含额外的空间,这使得没有被使用的空间被还给操作系统。这种形式的命令更慢并且在其被处理时要求在每个表上保持一个排他锁。

当选项列表被包围在圆括号中时,选项可以被写成任何顺序。如果没有圆括号,选项必须严格按照上面所展示的顺序指定。有圆括号的语法在KingbaseES V8R2 时被加入,无圆括号的语法则被废弃。

17.202.3. 参数

FULL

选择“完全”清理,它可以收回更多空间,并且需要更长时间和表上的排他锁。这种方法还需要额外的磁盘空间,因为它会创建该表的一个新拷贝,并且在操作完成之前都不会释放旧的拷贝。通常这种方法只用于需要从表中收回数量庞大的空间时。

FREEZE

选择激进的元组“冻结”。指定FREEZE 等价于参数 vacuum_freeze_min_age 和 vacuum_freeze_table_age 设置为0的 VACUUM。当表被重写时总是会执行激进的冻结,因此指定FULL时这个选项是多余的。

VERBOSE

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

ANALYZE

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

DISABLE_PAGE_SKIPPING

通常,VACUUM将基于可见性映射跳过页面。已知所有元组都被冻结的页面总是会被跳过,而那些所有元组对所有事务都可见的页面则可能会被跳过(除非执行的是激进的清理)。此外,除非在执行激进的清理时,一些页面也可能会被跳过,这样可避免等待其他页面完成对其使用。这个选项禁用所有的跳过页面的行为,其意图是只在可见性映射内容被怀疑时使用,这种情况只有在硬件或者软件问题导致数据库损坏时才会发生。

SKIP_LOCKED

指定VACUUM在开始处理一个关系时,不应等待任何冲突锁被释放:如果一个关系不能立即被锁定而不等待,则跳过该关系。注意,即使使用这个选项,VACUUM在打开关系的索引时仍然可能阻塞。此外,当从分区、表继承子表和某些类型的外部表获取样本行时,VACUUM ANALYZE可能仍然会阻塞。此外,当VACUUM通常处理指定分区表的所有分区时,如果分区表上有冲突的锁,则此选项将导致VACUUM跳过所有分区。

INDEX_CLEANUP

指定VACUUM尝试删除指向死元组的索引项。这通常是需要的行为,并且是默认的,除非将vacuum_index_cleanup选项设置为false,以便对表进行空化。当需要使vacuum尽可能快地运行时,将该选项设置为false可能是有用的,例如为了避免即将发生的事务ID封装(请参阅 防止事务ID回卷失败 )。但是,如果不定期执行索引清理,性能可能会受到影响,因为当表被修改时,索引将积累死元组,而表本身将积累死行指针,这些指针在索引清理完成之前无法删除。此选项对没有索引的表无效,如果使用FULL选项,则会忽略此选项。

TRUNCATE

指定VACUUM应该尝试截断表末尾的任何空页,并允许将截断的页返回给操作系统。这通常是需要的行为,并且是默认的,除非将vacuum_truncate选项设置为false,以便对表进行真空处理。将此选项设置为false可能有助于避免截断所需的表上的ACCESS EXCLUSIVE锁。如果使用FULL选项,则忽略此选项。

boolean

指定所选选项应该打开还是关闭。可以编写TRUEON,或1来启用这个选项,编写FALSEOFF,或0来禁用它。也可以省略``boolean``,此时假设TRUE

table_name

要清理的表或物化视图的名称(可以有模式修饰)。如果指定的表示一个分区表,则它所有的叶子分区也会被清理。

column_name

要分析的指定列的名称。缺省是所有列。如果指定了一个列的列表,则ANALYZE也必须被指定。

17.202.4. 输出

如果声明了VERBOSEVACUUM会发出进度消息来表明当前正在处理哪个表。各种有关这些表的统计信息也会打印出来。

17.202.5. 注意

要清理一个表,操作者通常必须是表的拥有者或者超级用户。但是,数据库拥有者被允许清理他们的数据库中除了共享目录之外的所有表(对于共享目录的限制意味着一个真正的数据库范围的VACUUM只能被超级用户执行)。VACUUM将会跳过执行者不具备清理权限的表。

VACUUM不能在一个事务块内被执行。

对具有GIN索引的表,VACUUM(任何形式)也会通过将待处理索引项移动到主要GIN索引结构中的合适位置来完成任何待处理的索引插入。

我们建议经常清理活动的生产数据库(至少每晚一次),以保证移除失效的行。在增加或删除了大量行之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的做法。这样做将把最近的更改更新到系统目录,并且允许 KingbaseES查询规划器在规划用户查询时做出更好的选择。

日常使用时,不推荐FULL选项,但在特殊情况时它会有用。一个例子是当你删除或者更新了一个表中的绝大部分行时,如果你希望在物理上收缩表以减少磁盘空间占用并且允许更快的表扫描,则该选项是比较合适的。VACUUM FULL通常会比简单VACUUM更多地收缩表。

VACUUM会导致I/O流量的大幅度增加,这可能导致其他活动会话性能变差。因此,有时建议使用基于代价的清理延迟特性。详情请参阅 基于代价的清理延迟

KingbaseES包括了一个“autovacuum”工具,它可以自动进行例行的清理维护。关于自动和手动清理的更多信息请见 日常清理

17.202.6. 例子

清理单一表onek,为优化器分析它并且打印出详细的清理活动报告:

VACUUM (VERBOSE, ANALYZE) onek;

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值