您需要在分区 table (postgres 11) 上添加索引吗?

Do you need to add an index on a partitioned table (postgres 11)?

我的团队正在考虑将具有 ~1TB 数据的非分区 table 迁移到分区 table。

我们将使用基于时间戳列的范围分区。

有一件事我不明白,如果它被用作分区键,我们是否需要在时间戳列上添加索引。如果我们将分区做得非常小(例如每天分区),这会以类似于索引的方式起作用吗?

我们只会在一天的最大分辨率上进行查询。

我不愿意添加索引,因为我们过去曾尝试过,但从未完成(可能是因为我们没有关闭写入。在较长时间内关闭写入并不是一个真正的选项)。

您的感觉是对的:省略分区列上的索引是分区实际上使查询更快的少数几个地方之一。

然后您可以对单个分区进行顺序扫描,并且不必为每个数据修改语句维护索引。

另一个优点是分区使得大量删除数据(沿着分区边界)更加高效。最后,autovacuum 的工作将变得更容易。

关于分区的两点:

  • 升级到v12;与分区有关的性能有了实质性的改进。

  • 不要使用太多分区。使用 v12,你可能会达到几千,在早期版本中你会更早地遇到性能问题。