分区删除时的 Postgres 分区查询性能
Postgres Partitioning Query Performance when Partitioned for Delete
我们在 Postgresql 12 上,希望对一组与数据源名称相关的表进行分区。一个源可以有数千万条记录,整个数据集在 2000 个数据源中占 space 的大约 900GB。我们没有更新这些记录的好方法,因此我们正在查看完整转储并在需要更新源数据时重新加载。这就是我们考虑使用分区的原因,这样我们就可以将新数据加载到新分区中,分离(然后删除)当前存放数据的分区,然后将最新数据附加到新分区中。查询将通过单个 ID 字段执行。我担心的是,由于我们按源名称分区并按分区定义中未使用的 ID 进行查询,因此我们将无法使用任何分区修剪,我们的查询将因此受到影响。
我们应该如何关注此用例的查询性能?将在正在查询的 ID 上定义一个索引,但根据 Postgres 文档,它可能会增加大量计划时间并使用大量内存来为查看许多分区的查询提供服务。
性能会受到影响,但这取决于分区的数量。您拥有的分区越多,计划和执行时间就越慢,因此请保持较低的数量。
您可以通过定义准备好的语句并重新使用它来节省查询计划时间。
我们在 Postgresql 12 上,希望对一组与数据源名称相关的表进行分区。一个源可以有数千万条记录,整个数据集在 2000 个数据源中占 space 的大约 900GB。我们没有更新这些记录的好方法,因此我们正在查看完整转储并在需要更新源数据时重新加载。这就是我们考虑使用分区的原因,这样我们就可以将新数据加载到新分区中,分离(然后删除)当前存放数据的分区,然后将最新数据附加到新分区中。查询将通过单个 ID 字段执行。我担心的是,由于我们按源名称分区并按分区定义中未使用的 ID 进行查询,因此我们将无法使用任何分区修剪,我们的查询将因此受到影响。
我们应该如何关注此用例的查询性能?将在正在查询的 ID 上定义一个索引,但根据 Postgres 文档,它可能会增加大量计划时间并使用大量内存来为查看许多分区的查询提供服务。
性能会受到影响,但这取决于分区的数量。您拥有的分区越多,计划和执行时间就越慢,因此请保持较低的数量。
您可以通过定义准备好的语句并重新使用它来节省查询计划时间。