【DB吐槽大会】第78期 - PG 不支持绕过shared buffer的查询和写入

背景


1、产品的问题点

  • PG 不支持绕过shared buffer的查询和写入

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

  • PG 读写操作都要经过shared buffer , 某些特定场景除外: 《PostgreSQL shared buffer 管理机制》
  • Bulk-reading (当表被全表扫描时, 只有当表的大小超过四分之一shared buffer时, 才会使用ring buffer)
    • When a relation whose size exceeds one-quarter of the buffer pool size (shared_buffers/4) is scanned. In this case, the ring buffer size is 256 KB.
  • Bulk-writing
    • When the SQL commands listed below are executed. In this case, the ring buffer size is 16 MB.
    • COPY FROM command.
    • CREATE TABLE AS command.
    • CREATE MATERIALIZED VIEW or REFRESH MATERIALIZED VIEW command.
    • ALTER TABLE command.
  • Vacuum-processing
    • When an autovacuum performs a vacuum processing. In this case, the ring buffer size is 256 KB.

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

  • 通用

4、会导致什么问题?

  • 大表查询, 写入大量数据(insert into)时可能导致shared buffer里面的热数据被挤出去. 业务高峰期可能带来RT抖动, 影响业务体验, 严重的甚至雪崩.

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

  • 避免高峰期全表扫描小于四分之一shared buffer的大表

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

  • 无法完全杜绝

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

  • 期望内核支持绕过shared buffer的查询和写入语法, 或通过会话GUC参数可以控制. 避免大表查询对热数据的影响.
上一篇:【DB吐槽大会】第75期 - PG 不支持索引失效功能


下一篇:【DB吐槽大会】第74期 - PG 不支持SQL维度资源限流