这篇文章主要介绍“PostgreSQL12的新特性REINDEX有什么作用”,在日常操作中,相信很多人在PostgreSQL12的新特性REINDEX有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL12的新特性REINDEX有什么作用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
PG 12引入REINDEX
CONCURRENTLY,为了解决在REINDEX期间不能执行查询操作的问题,REINDEX CONCURRENTLY使用了相对于pg_repack(前身是pg_reorg)成本更低的方法来实现在索引rebuild期间数据表的可读写查询,但rebuild的时间越长,需要的资源越多,其实现思路如下:
1.创建新的索引(在与原index一样的catalog中),以_ccnew结尾
2.构建新索引,这一步会并行去做
3.使新索引与在构建期间出现的变化同步(catch up)
4.重命名新索引为旧索引的名称并切换所有依赖旧索引的地方到新索引.旧索引设置为invalid(这一步成为交换)
5.标记旧索引为dead状态(vacuum进程可回收)
6.删除索引
上面每一步都需要事务.在reindexing table时,该表的所有索引会一次过进行收集每一步都会处理所有的索引.可以把这个过程视为在一个单独的事务中CREATE INDEX CONCURRENTLY后跟DROP INDEX的组合,中间有一步是完全透明的新旧索引切换.
如果在REINDEX期间出现异常,那么所有需要rebuild的索引的状态都是invalid,意味着这些索引仍然占用空间,定义仍在但不能使用.
下面是测试脚本,PG 11 vs PG 12的一些区别
PG 11
testdb=# CREATE TABLE tab (a int);
CREATE TABLE
testdb=# INSERT INTO tab VALUES (1),(1),(2);
INSERT 0 3
testdb=# CREATE UNIQUE INDEX CONCURRENTLY tab_index on tab (a);
ERROR: could not create unique index "tab_index"
DETAIL: Key (a)=(1) is duplicated.
testdb=# \d tab
Table "public.tab"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | |
Indexes:
"tab_index" UNIQUE, btree (a) INVALID
testdb=# REINDEX TABLE tab;
ERROR: could not create unique index "tab_index"
DETAIL: Key (a)=(1) is duplicated.
testdb=# DELETE FROM tab WHERE a = 1;
DELETE 2
testdb=# REINDEX TABLE tab;
REINDEX
PG 12
testdb=# CREATE TABLE tab (a int);
CREATE TABLE
testdb=# INSERT INTO tab VALUES (1),(1),(2);
INSERT 0 3
testdb=# CREATE UNIQUE INDEX CONCURRENTLY tab_index on tab (a);
psql: ERROR: could not create unique index "tab_index"
DETAIL: Key (a)=(1) is duplicated.
testdb=# REINDEX TABLE CONCURRENTLY tab;
psql: WARNING: cannot reindex invalid index "public.tab_index" concurrently, skipping
psql: NOTICE: table "tab" has no indexes
REINDEX
testdb=# DELETE FROM tab WHERE a = 1;
DELETE 2
testdb=# REINDEX TABLE CONCURRENTLY tab;
psql: WARNING: cannot reindex invalid index "public.tab_index" concurrently, skipping
psql: NOTICE: table "tab" has no indexes
REINDEX
testdb=# REINDEX INDEX CONCURRENTLY tab_index;
REINDEX
testdb=#
PG 12自动跳过了invalid index.
到此,关于“PostgreSQL12的新特性REINDEX有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!