【DB吐槽大会】第62期 - PG 不支持index skip scan

背景


1、产品的问题点

  • PG 不支持index skip scan

2、问题点背后涉及的技术原理

  • PG 的索引扫描方法仅支持index scan, index only scan, bitmap index scan.
    • index scan 为索引叶子节点链表顺序扫描.
    • index only scan与index scan类似, 只是某些情况下不需要回表.
    • bitmap index scan先汇总ctid的block id, 然后按block id顺序回表再recheck.
  • 以上扫描方法都不支持跳跃式扫描, 例如distinct gid, 即使GID字段有索引, 走索引扫描方法需要扫描整个索引才能得到distinct gid.
    • 并不能拿到1个GID后, 直接回到ROOT节点找大与上一个GID的下一个GID. 因此效率非常低.

3、这个问题将影响哪些行业以及业务场景

  • 稀疏值的统计、去重. 例如在用户的行为日志中, 求某个时间段的活跃用户(count distinct uid)

4、会导致什么问题?

  • 性能较差

5、业务上应该如何避免这个坑

使用递归查询来解决这个问题:

6、业务上避免这个坑牺牲了什么, 会引入什么新的问题

  • SQL难度急剧增加, 一般开发者可能不会写递归SQL.
  • 如果是框架生成的SQL则无法改写. 导致性能差.

7、数据库未来产品迭代如何修复这个坑

  • 希望引入index skip scan的功能, 直接在索引扫描层面解决, 而不是通过使用递归SQL来解决这个性能问题.

PostgreSQL 许愿链接

上一篇:【DB吐槽大会】第59期 - PG 缺少便捷的坏块修复能力


下一篇:【DB吐槽大会】第58期 - PG 复杂JOIN优化器有巨大提升空间