REINDEX
REINDEX¶
重建索引。
- 语法
sql REINDEX {INDEX | TABLE | DATABASE | SYSTEM} name
- 描述
-
REINDEX
使用存储在索引表中的数据重建索引,替换索引的旧副本。 在几种情况下可以使用REINDEX
:- 索引变得肿,也就是说,它包含许多空或几乎为空的页面。
在某些罕见的访问模式下,SeaboxMPP数据库中的B树索引可能会发生这种情况。
REINDEX
提供了一种通过编写没有死页的新版本索引来减少索引空间消耗的方法。- 已经更改了索引的
FILLFACTOR
存储参数,并希望确保所做的更改完全生效。
- 参数
-
该SQL命令参数说明见下
INDEX
- 重新创建指定的索引。
TABLE
- 重新创建指定表的所有索引。 如果该表具有辅助TOAST表,则该表也将重新编制索引。
DATABASE
- 重新创建当前数据库内的所有索引。 共享系统目录上的索引也会被处理。 这种形式的
REINDEX
不能在事务块内执行。 SYSTEM
- 在当前数据库内的系统目录上重新创建所有索引。 包括共享系统目录上的索引。 用户表上的索引未处理。这种形式的
REINDEX
不能在事务块内执行。 name
- 要重新建立索引的特定索引,表或数据库的名称。 索引和表名可以是模式限定的。 当前,
REINDEX DATABASE
和REINDEX SYSTEM
只能重新索引当前数据库, 因此它们的参数必须与当前数据库的名称匹配。
- 注解
-
REINDEX
与删除索引和重新创建索引相似,因为索引内容是从头开始重建的。 但是,锁定注意事项却大不相同。REINDEX
锁定对索引的父表的写入但不锁定读取。它还对正在处理的特定索引采取排他锁,这将阻塞该索引的读取。相反,DROP INDEX
会立即对父表加排他锁,从而阻止写入和读取。 随后的CREATE INDEX
锁定写但不锁定读;由于索引不存在,因此不会进行任何读取尝试,这意味着不会有阻塞,但读操作可能会强制进行高代价的顺序扫描。重新索引单个索引或表要求是该索引或表的所有者。 重新索引数据库需要成为数据库的所有者(请注意,所有者可以因此重建其他用户拥有的表的索引)。当然,超级用户可以随时重新索引任何内容。
REINDEX
不会更新索引的reltuples
和relpages
统计信息。要更新这些统计信息,请在重新建立索引后在表上运行ANALYZE
。如果怀疑共享的全局系统目录索引已损坏,则只能在SeaboxMPP utility模式下对它们进行索引。共享索引损坏的典型症状是“索引不是btree”错误,否则服务器将在启动时由于依赖损坏的索引而立即崩溃。在这种情况下,请联系SeaboxMPP客户支持。
- 示例
-
重建单个索引:
REINDEX INDEX my_index;
重建表
my_table
上的所有索引:REINDEX TABLE my_table;
- 兼容性说明
- SQL标准中没有
REINDEX
命令。 - 相关SQL命令
CREATE INDEX
,DROP INDEX
,VACUUM