当前有一个服务的日志表,需要每日进行清理。
当前的做法是truncate,但是会导致业务1分钟左右不能正常提供服务。
如果使用delete,则不能释放存储空间。
故推荐使用分区临时解决问题,在未来,使用异步写日志表的方式彻底优化掉。
但是据说postgresql做完分区后,update的性能会下降。
故进行了如下测试:
PG 11.6,所有数据库参数未调整
场景1:
3个分区,使用虚拟机本地磁盘,更新条件不包含分区键(对分区最坏的情况)
底库数据量: 25万
平均更新所有分区
分区(总耗时/平均耗时) | 不分区(总耗时/平均耗时) | 差距(毫秒) |
---|---|---|
52.647/1.7549 | 48.118/1.6039 | 0.1509 |
47.226/1.5742 | 41.527/1.3842 | 0.1899 |
场景2:
24个分区,使用虚拟机本地磁盘,更新条件包含分区键
底库数据量:86.4万
平均更新所有分区
分区(总耗时/平均耗时) | 不分区(总耗时/平均耗时) | 差距(毫秒) |
---|---|---|
180.078/2.0842 | 135.463/1.5678 | 0.5163 |
177.785/2.0576 | 129.475/1.4985 | 0.5591 |
场景3:
24个分区,使用/dev/shm存储数据(去除IO影响),更新条件包含分区键
底库数据量:86.4万
平均更新所有分区
分区(总耗时/平均耗时) | 不分区(总耗时/平均耗时) | 差距(毫秒) |
---|---|---|
74.815/0.8659 | 26.817/0.3104 | 0.5555 |
74.1/0.8576 | 25.916/0.2999 | 0.5576 |
场景4:
24个分区,使用虚拟机本地磁盘,更新条件包含分区键
底库数据量:86.4万
更新单一分区
分区(总耗时/平均耗时) | 不分区(总耗时/平均耗时) | 差距(毫秒) |
---|---|---|
173.459/1.6061 | 118.508/1.0973 | 0.5088 |
166.517/1.5418 | 109.532/1.0169 | 0.5248 |
场景3:
24个分区,使用/dev/shm存储数据(去除IO影响),更新条件包含分区键
底库数据量:86.4万
平均更新所有分区
分区(总耗时/平均耗时) | 不分区(总耗时/平均耗时) | 差距(毫秒) |
---|---|---|
81.384/0.7535 | 25.854/0.2393 | 0.5141 |
80.536/0.7457 | 25.233/0.2336 | 0.5120 |
结论:
分区后,UPDATE性能确实增加很多,绝对值在24个分区的情况下,稳定在在0.5毫秒左右。
如果看比率的话,是不分区的2.x倍。
但如果看绝对值的话,是绝对可以接收的范围。
网友评论