第二章 SQL命令参考-REINDEX

来源:互联网 发布:linux显示当前目录 编辑:程序博客网 时间:2024/05/16 08:48

REINDEX

Rebuildsindexes.

概要

REINDEX {INDEX| TABLE | DATABASE | SYSTEM} name

描述

REINDEX使用索引表中存储的数据重建索引,替换索引的旧副本。 有几种场景使用REINDEX:

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

•您已经更改了索引的fillfactor存储参数,并希望确保更改已完全生效。

parameter

INDEX

重新创建指定的索引。

TABLE

重新创建指定表的所有索引。如果表具有辅助TOAST表,那么也是重新索引。

DATABASE

重新创建当前数据库中的所有索引。共享系统目录的索引将被跳过。这种形式的REINDEX不能在事务块内执行。

SYSTEM

在当前数据库中重新创建系统目录上的所有索引。不处理用户表的索引。此外,跳过共享(全局)系统目录上的索引。这种形式的REINDEX不能在事务块内执行。

name

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

Notes

 

REINDEX类似于索引的删除和重新创建,因为索引内容从头开始重新构建。然而,锁定的考虑是相当不同的。 REINDEX锁定了索引的父表的写入,但不会读取索引的父表。它还需要对正在处理的特定索引进行排他锁定,这将阻止尝试使用该索引的读取。相比之下,DROP INDEX暂时在父表上排除锁定,阻止写入和读取。后续的CREATE INDEX锁定写入但不读取;由于索引不存在,所以没有读取将尝试使用它,这意味着将不会有阻塞,但读取可能被迫进行昂贵的顺序扫描。另一个重要的一点是,drop / create方法使使用该索引的任何缓存的查询计划无效,而REINDEX则没有。

重新索引单个索引或表需要该索引或表的所有者。重建数据库需要数据库的所有者(注意,所有者可以重建其他用户拥有的表的索引)。当然,超级用户总是可以重新索引任何东西。

如果您怀疑共享的全局系统目录索引已损坏,则只能在Greenplum实用程序模式下重新建立索引。损坏的共享索引的典型症状是“索引不是btree”错误,否则由于依赖损坏的索引,服务器在启动时立即崩溃。在此情况下,请联系Greenplum客户支持以获得帮助。

示例

Rebuild asingle index:

REINDEX INDEXmy_index;

Rebuild allthe indexes on the table my_tabie:

REINDEX TABLEmy_table;

兼容性

There is no REINDEX command in the SQL standard.

相关参考

CREATE INDEX, DROP INDEX, VACUUM
原创粉丝点击