使用分区表的好处

我们以一个例子来进行说明。
如果用户有一个很大的表,大小大约为1TB。其中的一列记录了数据的创建时间。应用程序每天向表中添加少量新数据,而且只更新最近的数据。旧的数据被保留在表中,用于做报告。这些更新会使表变膨胀,autovacuum不能有效的清理膨胀。手动vacuum更不可行,因为那将会锁定这张表更长的时间。这样经过日复一日的使用之后,查询会变得缓慢,性能会逐渐降低。
然后我们看一下分区表对于这个问题是否会有帮助。
我们的想法是把经常被访问和更改的数据(Hot data),与很少被访问和更改的数据(Cold data)分开。以上述的例子来看,可以通过创建时间戳将数据分割来达到这种效果。
分区的大小应该被控制为:更新和插入只能访问少数热分区,包含过期数据的冷分区应该保持不变。因为更新是在热分区中进行的,热分区会变膨胀,但是总体大小仍然比整个表的大小要小很多。清理更新的数据不会花费像清理整个表那么多的时间。一旦Hot data变为Cold data,就几乎不再需要被清理了。这样就有效的抑制了膨胀现象。
PostgreSQL中,如果给一张表加上了自动清理,那么当插入、删除或更新的行数超过了特定的临界值时,自动清理就会启动。因为所有这些操作都发生在热分区中,所以只有这些分区中的计数会超过临界值。冷分区中的这些计数几乎不可能改变。因此自动清理只会在热分区上运行而不是在整个表上运行。而如果一个表上没有分区,自动清理只会在整个表上运行。
需要注意的是清理热分区所需要的时间比清理未分区表所需要的时间要少的多。实际上,整个分区表上的膨胀是很明显的,因为分区把膨胀限制在了只在热分区上。因为现在清理花费的时间减少了很多,所以可以将它规划到故障时间和表保持锁定的时间在合理范围内中。
当清理运行在未分区表上时,他必须扫描整个未分区表。但是对于分区表来说,它只需要扫描热分区,大小比未分区表小得多,因此花费的时间也小得多。

By Kalath

你可能感兴趣的:(PostgreSQL,Highgo,DB)