PostgreSQL 重建索引
本文介绍在 PostgreSQL 中如何重建索引。
当索引被损坏或者包含错误的数据时,您可以重建索引。PostgreSQL 提供 REINDEX
语句用来重建一个或多个索引。
PostgreSQL REINDEX
语法
这里是 PostgreSQL REINDEX
语句的语法:
REINDEX
[ ( VERBOSE ) ]
[ ( CONCURRENTLY [ boolean ] ) ]
[ ( TABLESPACE new_tablespace ) ]
{ INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } name;
说明:
VERBOSE
关键字是可选的。如果提供此关键字,重建索引时将会显示进度。CONCURRENTLY
关键是可选的。它指示 PostgreSQL 在重建索引时,不需要阻止任何表上的操作。TABLESPACE new_tablespace
是可选的。它指示 PostgreSQL 在新的表空间重建索引。{ INDEX | TABLE | SCHEMA | DATABASE | SYSTEM }
用来指定重建的索引对象。INDEX
: 重建指定的索引。TABLE
: 重建指定的表中的所有的索引。SCHEMA
: 重建指定的 Schema 中的所有的索引。DATABASE
: 重建指定的数据库中的所有的索引。SYSTEM
: 重建指定的数据库的系统目录中的所有的索引。
name
指定对象的名字。
下面是一些具体的用法:
-
要重建单个索引,请使用
INDEX
关键字并指定索引名称:REINDEX INDEX index_name;
-
要重建一个表中的所有索引,请使用
TABLE
关键字并指定表的名称:REINDEX TABLE table_name;
-
要重建一个架构中的所有索引,请使用
SCHEMA
关键字并指定架构的名称:REINDEX SCHEMA schema_name;
-
要重建一个数据库中的所有索引,请使用
DATABASE
关键字并指定数据库名称:REINDEX DATABASE database_name;
-
要重建一个数据中的系统目录上的所有索引,请使用
SYSTEM
关键字并指定数据库名称::REINDEX SYSTEM database_name;
REINDEX
与 DROP INDEX
&CREATE INDEX
重建索引的过程相当于先删掉索引在新建相同定义的索引。也就是说: REINDEX
相当于 DROP INDEX
和 CREATE INDEX
语句的组合。它他们之间也有一些不同之处:
-
REINDEX
语句:- 锁定索引所属表的写入但不锁定读取。
- 对正在处理的索引进行排他锁,这会阻止尝试使用该索引的读取。除非您指定
CONCURRENTLY
关键字。
-
DROP INDEX
和CREATE INDEX
语句:DROP INDEX
通过获取表上的排他锁来锁定索引所属表的写入和读取。CREATE INDEX
语句会锁定索引的父表中的写入但不锁定读取。但是,在创建索引期间读取可能会很昂贵。
结论
本文介绍了在 PostgreSQL 中如何使用 REINDEX
语句重建一个或多个索引。