温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PostgreSQL12的新特性REINDEX有什么作用

发布时间:2021-11-09 11:20:21 来源:亿速云 阅读:672 作者:iii 栏目:关系型数据库

这篇文章主要介绍“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有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI