digoal
2019-12-06
PostgreSQL , global index , 全局索引
PG 目前只有本地索引,分区索引(partial index),表达式索引。
本地索引指索引是针对当前表里面数据的,不针对继承表的数据,所以是本地索引。
分区索引,指索引可以带where条件,所以也叫partial index。
表达式索引指索引支持表达式(immutable表达式)。
什么情况下需要全局索引呢?
例如一个分区表,需要对ID字段实施唯一、主键约束,就需要全局索引。(当然了,如果字段是分区字段,那么全局唯一可以在分区字段上用本地索引实现,但是其他字段要唯一的话,就必须用到全局索引)
索引是如何联系到数据的呢?keyvalue -> ctid(本地表的行号,blocknumber, offset)
如果要支持全局索引,索引到目标记录除了ctid,还需要知道这条记录在哪个目标子表。所以index leaf page内应该是 keyvalue -> tableoid+ctid 的内容。
global index的社区沟通
有了全局索引,可以保证分区表的全局唯一等,但是索引会变得很大,所以还需要分区全局索引。
create global index xx on table (c1,c2) partition by (c2) hash (4);
实现方法其实也比较简单,partial index,多棵树来构建。
https://www.percona.com/blog/2019/11/20/proposal-for-global-indexes-in-postgresql/
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.