Ale*_*aru 5 postgresql partitioning
设置
我们有一个多租户应用程序,大约有 1000 个客户。当客户流失时,我们会在一段时间后删除他们的所有数据。我们有一些非常大的表,我们正在考虑使用分区来按客户拆分它们。
问题
1000 个租户(客户)是很多分区 - 在 PostgreSQL 上这样做合理吗?
更多细节
目前,我们的租户之间的分离是通过account_id数据库中所有表上的列来实现的。有几张桌子都很大。例如,有一个event表(我对分区感兴趣的表)包含审核日志和我们应用程序中发生的所有事件的其他事件。
以下是有关事件表的一些事实:
account_id非常不均匀,5% 的帐户拥有 50% 的数据。author_id等等)account_id)。删除的数据可能有数百万行。没有更新。删除大帐户的情况很少见,目前并不是一个大的性能问题。account_id+ id)或给定时间段内的所有事件。并不总是设定时间段。account_id始终出现在查询中。可能的解决方案
分区方式account_id:
优点:
DROP TABLE.WHERE account_id = 123缺点:
按时间戳分区:
优点:
缺点:
分区主要是为了加快删除和顺序扫描的速度。
如果您最大的痛苦是 的大量删除account_id,则该列上的列表分区将是最好的解决方案。
如果您最大的痛苦是删除早于某个日期的所有数据,那么按时间进行范围分区将是解决方案。
如果您有多个查询必须对大型表执行顺序扫描,但有条件WHERE或account_id时间限制,则根据该WHERE条件进行分区将允许 PostgreSQL 仅对某些分区执行顺序扫描。
您必须确定这些事情是否足以让您考虑分区。分区并不是免费的:它会增加查询计划时间,有时还会增加执行时间。
分区不会使索引扫描更快,通常情况恰恰相反。仅当您希望从中获得真正的好处时才进行分区。
1000 个分区几乎太多,效率低下。您可能会考虑为较大的帐户设置单独的分区,并将其余帐户捆绑在一起,也许使用默认分区。