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

背景

1、产品的问题点

  • PG 不支持index skip scan

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

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

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

  • 稀疏值的统计、去重. 例如在用户的行测试技术与信号处理为日志中, 求某个时间段的活跃用户(count distinct uid)

4、会导致什么问题测试技术基础?

  • 性能较差

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

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

  • 《重新发现PostgreSQL之美 -c#为什么用的人很少 6 index链表跳跳糖 (CTE recursive 递归的详细用例)》
  • 《递归开发者选项怎么关闭+排序字段c#委托加权 skip索引失效的几种情况和解决 scan 解决 窗口查询多列分组去重的性能问题》
  • PostgreSQL 排序去重limit查询Oracle优化 - 递归 vs group分组 (loop降到极限, block scan降到极限)》
  • 《PostgreSQL 递归妙用案例 - 分组数据去重与打散》
  • 《PostgreSQL Oracle 兼容性之 - INDEX SKIP SCAN (递归查询变态优化) 非驱动列索引扫描优化》关系型数据库
  • 《用PostgreSQL找回618秒逝去的青春 - 递归收敛优化》
  • 《distinct xx和count(distinct xx)的变态递归优化方法 - 索引收敛(skip scan)扫描》
  • 《P测试技术基础答案ostgreSQL雕虫小技cte 递归查询,分组TOP性c#委托能提升44倍》
  • 《递归优化CASE - group by & distinct tuning case : use WITH RECURSIVE and min() function数据库
  • 《递归优化CASE数据库 - p索引erformance tuning case关系型数据库有哪几个 :use cursor\tc#和c++区别rig索引符号ger\recursive repla索引符号ce (grouc#是什么p by and order by) REDUCE needed blockes scan》

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

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

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

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

Postgr数据库系统概论eSQL 许愿链接