天天看点

PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新smooth化

postgresql , 10.0 , brin , de-summarization , summarization , 平滑更新brin , 平滑失效brin

我们将数据存入postgresql时,如果创建的是堆表,那么数据是往数据文件的末尾不断追加存储的。

为了提高数据的检索速度,可以对响应的字段创建索引,在postgresql中,已有8种索引类型,分别是b-tree,hash, gin, gist, sp-gist, brin, bloom, rum。分别对应不同的应用场景。

如果数据值与物理存储线性相关性比较好,可以使用块级索引(brin),以块(或连续的若干块)为最小单位,索引中存储的是这些最小单位的统计信息(最大值,最小值,记录条数,sum,null值条数等)。

为了提高插入速度,heap末端的块,可能并不会实时的更新到brin索引中,10.0以前,vacuum或者autovacuum表时,会生成未生成统计信息的heap block range,如果插入很快,比如在一个vacuum周期内,插入了100个数据块的内容,那么vacuum需要扫描这100个数据块并生成brin索引对应的信息。

PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新smooth化

为了防止插入过快,导致vacuum一次要统计过多的数据块,或者导致未进入brin索引的堆表末端数据块过多,10.0的改进如下,在插入时,如果插入到下一个block range的块时,自动触发vacuum去统计前一个block range的brin统计信息(如果还没有被统计的话)。

这样就可以解决前面提到的问题,因为insert的时候,只要到达block range边界,就会自动触发vacuum去统计它。

开启"insert的时候,只要到达block range边界,就会自动触发vacuum去统计它"的方法,创建索引时,指定autosummarize参数。

<a href="https://www.postgresql.org/docs/devel/static/sql-createindex.html">https://www.postgresql.org/docs/devel/static/sql-createindex.html</a>

PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新smooth化

同时,10.0还新增了用户udf接口,用户可以自己调用函数,去统计(更新)brin索引,指定表,以及堆表对应的block_id即可。

patch信息如下

brin记录的是block range的最大值,最小值,随着对应block range内数据的更新,删除,brin idx中对应的block range统计信息可能会越来越宽泛(不准确),因此为了提高brin的精度,10.0新增了一个失效接口,可以将对应block range的brin index内的条目失效,然后你可以等vacuum再次统计它,或者调用前面提到的udf接口来统计它。

PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新smooth化

失效heap block range对应brin idx条目的方法

这个patch的讨论,详见邮件组,本文末尾url。

postgresql社区的作风非常严谨,一个patch可能在邮件组中讨论几个月甚至几年,根据大家的意见反复的修正,patch合并到master已经非常成熟,所以postgresql的稳定性也是远近闻名的。

<a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=7526e10224f0792201e99631567bbe44492bbde4">https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=7526e10224f0792201e99631567bbe44492bbde4</a>

<a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=c655899ba9ae2a0d24e99c797167c33e0cfa0820">https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=c655899ba9ae2a0d24e99c797167c33e0cfa0820</a>