Recent Posts

PostgreSQL 索引虚拟列 - 表达式索引 - JOIN提速

3 minute read

背景 CASE: 使用虚拟索引,响应时间从2.3秒下降到0.3毫秒 业务系统在设计时,为了减少数据冗余,提升可读性,通常需要将不同的数据放到不同的表。 在查询时,通过多表JOIN来补齐需要查询或在过滤的内容。 比如这样的例子: 有两张表,分别有1千万和100万数据,当用户查询时,需要补齐那100万表中的某个...

乱序写入导致的索引膨胀(B-tree, GIN, GiST皆如此)

1 minute read

背景 有些场景,用户会发现重建索引,索引比原来更小。 通常这种情况是索引字段乱序写入,导致索引频繁分裂,使得索引页并不是百分百填满。膨胀使然。 B-Tree索引 由于索引页中的数据是有序的,因此在乱序写入时,索引页可能出现分裂,分裂多了,空洞就会多起来(一页里面没有填满)。 例子 1、先建索引,乱序写入。...

PostgreSQL 如何快速构建 海量 逼真 测试数据

3 minute read

背景 为了测试或验证需要,通常需要快速的构建测试数据。 PostgreSQL提供了一些非常有用的功能,可以帮助用户快速的构建测试数据。 有趣的功能 1、SRF 返回多条记录的函数。例如 ...

PostgreSQL 11 preview - compress method 接口 - 暨开放接口系列

10 minute read

背景 PostgreSQL是一款扩展能力极强的数据库,这也是PG可以深入各个垂直行业的原因。 PostgreSQL的开放式接口 已有非常多跟进自定义接口扩展出来的插件。 下面是自定义接口对应的文档。 1、自定义函数 https://www.postgresql.org/docs/10/static/xfu...

PostgreSQL 异步消息实践 - Feed系统实时监测与响应(如 电商主动服务) - 分钟级到毫秒级的实现

9 minute read

背景 在很多业务系统中,为了定位问题、运营需要、分析需要或者其他需求,会在业务中设置埋点,记录用户的行为在业务系统中产生的日志,也叫FEED日志。 比如订单系统、在业务系统中环环相扣,从购物车、下单、付款、发货,收货(还有纠纷、退款等等),一笔订单通常会产生若干相关联的记录。 每个环节产生的属性可能是不一样的...

PostgreSQL 电商小需求 - 凑单商品的筛选

less than 1 minute read

背景 电商的促销活动非常多,规则可能比较复杂,要薅羊毛的话,数学可能要比较好才行。因此也出现了大量的导购网站,比如SMZDM。 但是实际上电商里面也有类似的应用,可以智能的分析买家的需求,根据买家的需求、已有的券、购物车,向用户推荐凑单品。 凑单的需求,本质上是多个字段组合搜索的需求。 1、购物车总金额 ...

PostgreSQL Oracle 兼容性之 - rowid (CREATE TABLE WITH OIDS)

1 minute read

背景 Oracle的数据中,通过ROWID可以定位到一条记录,当记录没有发生行迁移时,ROWID是不变的,因此即使不使用PK,也能很好的定位到一条记录。 PostgreSQL中,也有行号,CTID,由BLOCK_ID和ITEM_ID组成,即哪个数据块的哪条记录。 但是PostgreSQL的引擎为多版本引擎,因...