大表分区有很多好处:
1):减少单表大小,提高分区子表查询效率
2):方便维护表,如创建索引耗时更短,IO、CPU消耗更少,另外可以通过清理历史分区(truncate 历史分区)来释放磁盘空间(PostgreSQL 生产delete一般不释放空间)。
3):分区子表更小,索引层级更低,减少索引和数据扫描。
4):DB内部维护任务autovacuum/freeze/analyze 最近分区子表而不是vacuum/freeze/anlyze整个大表,降低io消耗,减少对业务库的io压力、减少表膨胀、避免大表vacuum freeze等造成的延迟。
分区业务改造要点:
0,如果是双活库,两边机房都需要分区改造。
1,所有select语句需要加分区字段限制,能通过=限定的最好指定具体值,其他的通过限制时间段(只扫描必要的分区子表+父表)。
2,排查业务代码里是否有通过insert/update/delete等操作后返回的记录数判断操作成功与否。
3,禁用 insert into 分区主表 on conflict do 语句。
4,当插入tps大于100时,直接insert into 分区子表/ update 分区子表 。
5,要有明确的表生命周期,如保留T-3个月数据
6,历史数据需要迁移到Hbase/ES等平台进行查询,线上库只支持最近几个月的数据读写。
7,如果该表存在实时复制订阅,考虑上下游数据流,可能需要修改正则表达式匹配分区表。