VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

REINDEX

REINDEX - 重建索引

语法格式

REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } name

说明

REINDEX使用存储在索引表中的数据重建索引,替换索引的旧副本。有几种情况可以使用REINDEX :

索引已损坏,不再包含有效数据。虽然理论上这种情况永远不会发生,但实际上索引会因软件错误或硬件故障而损坏。REINDEX 提供了一种恢复方法。

索引已变得”臃肿”,即它包含许多空或几乎空的页面。在某些不常见的访问模式下,Vastbase E100中的B树索引会发生这种情况。 REINDEX 提供了一种通过编写没有死页的索引的新版本来减少索引的空间消耗的方法。

您已更改索引的存储参数说明(例如fillfactor),并希望确保更改已完全生效。

使用 CONCURRENTLY 选项的索引构建失败,留下”无效”索引。这些索引没用,但使用 REINDEX 重建它们会很方便。请注意 REINDEX 不会执行并发构建。要在不干扰 生产环境的情况下构建索引,应删除索引并重新发出 CREATE INDEX CONCURRENTLY 命令。

参数说明

  • INDEX

    重新创建指定的索引。

  • TABLE

    重新创建指定表的所有索引。如果表具有辅助”TOAST”表,则也会重新编制索引。

  • SCHEMA

    重新创建指定模式的所有索引。如果此架构的表具有辅助”TOAST”表,那么也会重新编制索引。还处理共享系统目录上的索引。这种形式的REINDEX 无法在事务块中执行。

  • DATABASE

    重新创建当前数据库中的所有索引。还处理共享系统目录上的索引。这种形式的 REINDEX 无法在事务块中执行。

  • SYSTEM

    重新创建当前数据库中系统目录的所有索引。包含共享系统目录的索引。不处理用户表的索引。这种形式的 REINDEX 无法在事务块中执行。

  • name

    要重建索引的特定索引,表或数据库的名称。索引和表名称可以是模式限定的。目前, REINDEX DATABASE 和 REINDEX SYSTEM 只能重新索引当前数据库,因此它们的参数说明必须与当前数据库的名称匹配。

  • VERBOSE

    在重新编制索引时打印进度报告。

注意事项

如果您怀疑用户表上的索引损坏,您可以使用 REINDEX INDEX 或 REINDEX TABLE 简单地重建该索引或表中的所有索引。

如果您需要从系统表上的索引损坏中恢复,则事情会变得更加困难。在这种情况下,系统没有使用任何可疑索引本身很重要。(实际上,在这种情况下,由于依赖于损坏的索引,您可能会发现服务器进程在启动时立即崩溃。)要安全恢复,必须使用-P 选项启动服务器,这会阻止其使用系统目录查找的索引。

一种方法是关闭服务器并启动单用户Vastbase E100服务器,其命令行中包含 -P选项。然后,可以发出 REINDEX DATABASE , REINDEX SYSTEM , REINDEX TABLE或 REINDEX INDEX ,具体取决于您要重建的程度。如果有疑问,请使用 REINDEX SYSTEM 选择重建数据库中的所有系统索引。然后退出单用户服务器会话并重新启动常规服务器。有关如何与单用户服务器界面交互的详细信息,请参阅postgres参考页面。

或者,可以使用其命令行选项中包含的 -P启动常规服务器会话。执行此操作的方法因客户端而异,但在所有基于libpq的客户端中,可以在启动客户端之前将PGOPTIONS 环境变量设置为 -P。请注意,虽然此方法不需要锁定其他客户端,但在修复完成之前阻止其他用户连接到损坏的数据库仍然是明智之举。

REINDEX类似于索引的删除和重新创建,因为索引内容是从头开始重建的。但是,锁定考虑因素是相当不同的。REINDEX锁定写入但不读取索引的父表。它还对正在处理的特定索引进行独占锁定,这将阻止尝试使用该索引的读取。相比之下,DROP INDEX 暂时对父表进行独占锁定,阻止写入和读取。随后的 CREATE INDEX锁定写入但不读取;因为索引不存在,所以没有读取会尝试使用它,这意味着存在将不会阻塞,但读取可能会被迫进入昂贵的顺序扫描。

重新索引单个索引或表需要成为该索引或表的所有者。重新索引架构或数据库需要成为该架构或数据库的所有者。请注意,非超级用户有时可以重建其他用户拥有的表的索引。但是,作为特殊例外,当非超级用户发出REINDEX DATABASE , REINDEX SCHEMA 或 REINDEX SYSTEM时,将跳过共享目录上的索引,除非用户拥有目录(通常情况并非如此)。当然,超级用户总是可以重新索引任何东西。

不支持重新索引分区表或分区索引。可以单独重新索引每个单独的分区。

示例

重建单个索引:

REINDEX INDEX my_index;

重建表 my_table 上的所有索引:

REINDEX TABLE my_table;

重建特定数据库中的所有索引,而不必信任系统索引是否有效:

$ export PGOPTIONS="-P"
$ psql broken_db
...
broken_db=> REINDEX DATABASE broken_db;
broken_db=> \q