postgreSQL 并行创建索引(CONCURRENTLY)

       通常 PostgreSQL会给要创建索引的表加锁,让它不能被写入(update|delete|insert), 并且用该表上的一次扫描来执行整个索引的创建。其他事务仍然可以读取表 (select), 但是如果它们尝试在该表上进行插入、更新或者删除,它们会被阻塞直到索引创建完成。

       为了解决PostgreSQL创建索引不阻塞其他DML事务的问题,通过 指定CREATE INDEXCONCURRENTLY选项实现。当使用这个选项时,PostgreSQL必须执行该表的 两次扫描,此外它必须等待所有现有可能会修改或者使用该索引的事务终止。

       对于临时表,CREATE INDEX始终是非并发的,因为没有其他会话可以访问它们,并且创建非并发索引的成本更低。

       如果在创建索引的过程中发生了意外或异常终止,这个未被创建成功的索引不会自动撤销,而是保留在系统中,被标记为INVALID状态,需要手工处理。\d  tabname可以查看索引的是否处于INVALID状态。

      如果遇到INVALID状态的索引,有两个处理办法:

     a>  drop index idx_name;create index concurrently;

     b>  reindex index concurrently

创建表、造数、创建索引示例

postgres=# create table test_idx(id serial primary key, note text);
postgres=# insert into test_idx(note) select generate_series(1,5000000);
postgres=# create index idx_test_idx on test_idx(note);
postgres=# create index concurrently idx_test_idx2 on test_idx(note);

查看索引的大小:
postgres=# select pg_size_pretty(pg_relation_size('idx_test_idx')),pg_size_pretty(pg_relation_size('idx_test_idx2'));

查看表的基本信息:
ostgres=# \d test_idx
                            Table "public.test_idx"
 Column |  Type   | Collation | Nullable |               Default
--------+---------+-----------+----------+--------------------------------------
 id     | integer |           | not null | nextval('test_idx_id_seq'::regclass)
 note   | text    |           |          |
Indexes:
    "test_idx_pkey" PRIMARY KEY, btree (id)

REINDEX重建索引:
postgres=# REINDEX INDEX CONCURRENTLY idx_test_idx6;

       

后记:

    CREATE INDEX  CONCURRENTLY 的基本原理需要进一步深入了解。

### PostgreSQL 不同版本对比及特性 #### 版本13的新功能和特性 PostgreSQL 13引入了一系列增强功能,旨在提高性能、可扩展性和易用性。这些改进包括但不限于: - **并行聚合**:通过允许多个CPU核心参与计算来加速复杂查询中的聚合操作[^1]。 - **索引创建优化**:新增`CREATE INDEX CONCURRENTLY`命令支持更多的并发场景,减少了锁竞争带来的负面影响。 - **分区表管理简化**:增强了对大规模分片数据的支持,使得维护大型分布式应用更加容易。 #### 相对于版本12的功能改进 相较于之前的版本,PostgreSQL 13不仅继承了前代的优点,还进一步提升了某些方面的能力: - **查询规划器的准确性提升**:通过对统计信息收集机制的调整以及更多类型的表达式的成本估算模型更新,使查询执行计划更为合理高效。 - **逻辑复制槽的心跳检测**:增加了心跳消息发送频率,默认情况下每分钟一次,有助于及时发现网络中断等问题,保障数据同步的安全可靠。 #### 版本14的新功能和特性 到了第14版,PostgreSQL继续推进技术创新和服务质量改善: - **JSONB路径运算符**:提供了新的语法用于访问嵌套结构内的特定字段或数组元素,极大地方便了处理半结构化文档型数据的工作流。 - **多列统计数据自动收集**:当定义复合唯一约束或多列外键关系时会自动生成相应的统计元数据,从而帮助优化器更好地理解工作负载模式,进而做出更优的选择。 #### 开源性质与其他竞品比较 值得注意的是,在考虑采用哪种数据库管理系统作为企业级解决方案的一部分时,除了关注具体的技术规格之外,还需要考虑到软件本身的授权方式及其社区生态系统的活跃度等因素。例如,虽然Oracle拥有丰富的内置工具集,但它属于专有产品线;而像MySQL这样的项目尽管也是开放源码发布的,但其GPLv2许可证条款可能会给部分商业用途带来不便之处。相比之下,PostgreSQL采用了较为宽松的MIT风格许可协议,这意味着开发者可以自由地修改代码库并将改动反馈回去供所有人共享受益[^3]。 ```sql -- 示例SQL语句展示如何查看当前安装的PostgreSQL服务器版本号 SELECT version(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我曾阿牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值