PostgreSQL 14.3(AWS RDS)中创建CONCURRENTLY索引后索引定义无该选项的问题咨询
PostgreSQL 14.3(AWS RDS)中创建CONCURRENTLY索引后索引定义无该选项的问题咨询
嘿,别担心,这是完全正常的情况,咱们一步步来拆解清楚:
为什么pg_indexes里的indexdef不包含CONCURRENTLY?
CONCURRENTLY并不是索引本身的属性,它只是创建索引时的执行策略选项——它控制的是PostgreSQL创建索引的过程(比如避免持有表的排他锁、分阶段完成索引构建,从而不阻塞其他读写操作),一旦索引创建完成,它和普通的BTREE索引在结构、功能上没有任何区别。所以PostgreSQL不会把这个执行选项记录到索引的元数据定义里,这就是你查不到它的原因。
如何确认CONCURRENTLY确实生效了?
你可以通过这些方式验证:
- 创建过程中的行为验证:如果是用
CONCURRENTLY创建的索引,在创建期间你依然可以对public.ap_identifier表执行插入、更新、删除操作,不会被阻塞;而如果是普通的CREATE INDEX,创建过程中表会被锁住,写操作会排队等待。 - 检查索引有效性:
CONCURRENTLY创建索引时,如果中途遇到问题,会留下一个无效的索引(状态为indisvalid = false),你可以用这条SQL查询:
如果你的SELECT indexrelid::regclass, indisvalid FROM pg_index WHERE indrelid = 'public.ap_identifier'::regclass;idx_test对应的indisvalid是true,说明索引已经成功创建完成,并且是按无阻塞的方式执行的。 - AWS RDS的支持情况:AWS RDS上的PostgreSQL默认就支持
CONCURRENTLY选项,不需要额外开启任何数据库开关,只要你执行CREATE INDEX CONCURRENTLY语句成功,就说明已经按该模式执行了。
总结一下:你看到的现象是PostgreSQL的正常行为,CONCURRENTLY的作用已经在创建过程中体现了,索引本身的定义里不会保留这个选项,不用额外担心。
备注:内容来源于stack exchange,提问作者Micha
相关产品推荐
相关产品推荐

