重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“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有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联-成都网站建设公司网站,小编会继续努力为大家带来更多实用的文章!