根据日期范围对表进行分区并有效删除它们
Partitioning tables based on a range of date with and deleting them efficiently
我需要对 table devices
进行分区,这样我就可以轻松删除不再需要的分区。这基于对插入设备的特定用户的订阅。我的计划是:
- 订阅 7 天的用户的所有设备都进入 table 7 天的意思,比如说 devices_7d。同样,14 天的设备转到 devices_14d。
- 有 22 个不同的订阅期 - 7 天、14 天、30 天等,最长 3 年。因此,会有尽可能多的分区。
- 根据天数,每 X 天删除 table。这意味着,我每 7 天删除 table devices_7d,然后创建一个具有相同名称的新 table - 确保新设备(订阅 7 天)是插入这个新 table
这主要是为了确保清理设备用完的 space,并在移除后立即使用(因此选择删除 table)。
我的问题是这是一个好的解决方案还是有更好的解决方案来解决这个问题?
更重要的是,有没有一种方法可以在 Postgres 中自动完成(或配置)这个(第 3 点)。也就是说,我们指示它删除 table 并每 7 天创建一个新的(对于不同的订阅期也是如此) ?
注意:我使用的是 Postgres 10
不要将 PostgreSQL v10 与分区一起使用。至少升级到 v12。
没有自动创建和删除分区的方法;您将不得不使用 cron
等外部工具或 pg_timetable
.
等扩展来安排它
我质疑你的分区方案。如果您每 7 天删除并重新创建一次分区,则您不能拥有从该期间中间开始的 7 天订阅。
如果我是你,我会在订阅 到期 日期对 table 进行范围分区。然后很容易在单个 DROP TABLE
中删除所有过期的订阅,而不考虑订阅期。
我需要对 table devices
进行分区,这样我就可以轻松删除不再需要的分区。这基于对插入设备的特定用户的订阅。我的计划是:
- 订阅 7 天的用户的所有设备都进入 table 7 天的意思,比如说 devices_7d。同样,14 天的设备转到 devices_14d。
- 有 22 个不同的订阅期 - 7 天、14 天、30 天等,最长 3 年。因此,会有尽可能多的分区。
- 根据天数,每 X 天删除 table。这意味着,我每 7 天删除 table devices_7d,然后创建一个具有相同名称的新 table - 确保新设备(订阅 7 天)是插入这个新 table
这主要是为了确保清理设备用完的 space,并在移除后立即使用(因此选择删除 table)。
我的问题是这是一个好的解决方案还是有更好的解决方案来解决这个问题?
更重要的是,有没有一种方法可以在 Postgres 中自动完成(或配置)这个(第 3 点)。也就是说,我们指示它删除 table 并每 7 天创建一个新的(对于不同的订阅期也是如此) ?
注意:我使用的是 Postgres 10
不要将 PostgreSQL v10 与分区一起使用。至少升级到 v12。
没有自动创建和删除分区的方法;您将不得不使用 cron
等外部工具或 pg_timetable
.
我质疑你的分区方案。如果您每 7 天删除并重新创建一次分区,则您不能拥有从该期间中间开始的 7 天订阅。
如果我是你,我会在订阅 到期 日期对 table 进行范围分区。然后很容易在单个 DROP TABLE
中删除所有过期的订阅,而不考虑订阅期。