PostgreSQL12的新特性REINDEX有什么作用
这篇文章主要介绍“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有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341