天天看點

【DB吐槽大會】第28期 - PG 每次隻擴充1個block

背景

1、産品的問題點

  • PG 每次隻擴充1個block

2、問題點背後涉及的技術原理

  • 當寫入或更新資料時, 如果現有的資料檔案無法放下新的tuple, 需要extend 資料檔案, 但是PG隻擴充1個資料塊.

3、這個問題将影響哪些行業以及業務場景

  • 高速寫入的業務場景, 例如IOT, 時序, feedlog類.

4、會導緻什麼問題?

  • 導緻extend block exclusive鎖競争, 影響寫入性能

5、業務上應該如何避免這個坑

  • 編譯時, 選擇更大的block size, 隻能弱化無法避免這個問題.

6、業務上避免這個坑犧牲了什麼, 會引入什麼新的問題

  • 管理更加複雜, 而且無法完全避免.
  • 由于目前PG的一個執行個體隻能選擇一種block size規格, 如果選擇大的block size, 會導緻某些需要小block size的表可能性能變差并浪費更多shared buffer. (例如偏TP的業務)

7、資料庫未來産品疊代如何修複這個坑

  • 希望可以自定義擴充規則, 例如
    • 表級别可以設定, 每次擴充多少個block, 或者:
    • 根據資料表的大小, 階梯性增加每次擴充多少個blocks, 直到封頂max extend blocks

https://github.com/digoal/blog/blob/master/202109/20210903_03.md#postgresql-%E8%AE%B8%E6%84%BF%E9%93%BE%E6%8E%A5 https://github.com/digoal/blog/issues/76