Recent Posts

PostgreSQL 函数式索引使用注意 - 暨非immutable函数不适合索引的原因

2 minute read

背景 PostgreSQL支持表达式索引,但是表达式必须是immutable的,也即是当输入参数不变时,结果是永恒不变的。 因为当表达式涉及的变量不变时,索引本身不会变化。 给个例子,如果我们有一张表存储了商品价格,另一张表存储了商品折扣 ,如果我们想通过折扣后的价格范围搜索符合价格区间的商品ID,可以使用索...

如何让json里面的value支持索引范围检索

1 minute read

背景 JSON,JSONB是PG从9就开始引入的数据类型,开发人员非常喜欢,对于JSON里面的内容的检索,我们可以使用GIN索引,目前直接对JSON字段创建GIN索引,可以支持任意PATH的等值、包含检索。 https://www.postgresql.org/docs/10/static/datatype-j...

HybridDB for PostgreSQL , Greenplum 写入性能优化实践

2 minute read

背景 Greenplum写入数据的性能优化实践。 1 链路 尽量缩短客户端和数据库的链路,不要太多的跳数,比如NAT,PROXY,等越多,性能越差。 2 连接方式 尽量使用长连接,不要使用短连接,短连接的打开开销非常大。 3 存储属性 where storage_parameter is: APP...

PostgreSQL stable 函数调用次数

2 minute read

背景 immutable 函数,输入参数静态时,返回结果不变,所以它在plan前先计算,得到一个常量后,放到QUERY里面再生成执行计划。 stable 函数,输入参数静态时,如果在一个事务中多次调用它,返回结果不变。 显然一个immutable 函数在同一个SQL中,永远只调用一次,(在bind , exe...

PostgreSQL vacuum 的页内tuple move收缩空间

13 minute read

背景 当往数据库内插入记录时,PostgreSQL heap page内部的空间分配是这样的,lp内容为对应tuple在当前页的OFFSET,lp的位置固定长度固定(固定page head后面就是lp),lp固定方便tuple的搜索(例如ctid的第二个部分就是lp信息)。 lp从page head...

PostgreSQL 多值列的选择性 - Statistics, Cardinality, Selectivity, Estimate

15 minute read

背景 基于成本的优化器,选择性估算是重要的环节,对于单值列,通过表的行数,数据分布柱状图、高频值、唯一值比例、空值比例等统计信息(pg_class, pg_stats),以及用户输入的条件,可以估算得到输入条件的选择性。 对于多个条件的估算,之前PG给了比较暴力的AND,OR的叠加选择性计算。 PG 10开始...

Greenplum支持人为多阶段聚合的方法 - 直连segment(PGOPTIONS=’-c gp_session_role=utility’) Or gp_dist_random(‘gp_id’) Or 多阶段聚合 prefunc

7 minute read

背景 聚合操作是分析型场景中最常见的需求之一,在Greenplum中,数据已分布存储,聚合操作需要多阶段执行。 实际上PostgreSQL 9.6开始支持并行聚合后,聚合的方法也与分布式数据库的多阶段聚合类似。 创建聚合函数时,必须实现多阶段的API才能够让聚合操作真正的并行起来。 有些插件可能因为某些原因...

Greenplum 与 PostgreSQL 修改元数据(catalog)的方法 allow_system_table_mods

1 minute read

背景 PostgreSQL大量的信息保存在元数据中,所有的元数据都是内部维护的,例如建表、建索引、删表等操作,自动维护元数据。 在某些迫不得已的情况下才可能需要直接对元数据进行修改。 默认情况下,用户是允许修改元数据的。 postgres=# \set VERBOSITY verbose post...