在PostgreSQL中存储和查询滚动数据

bsh*_*der 12 postgresql database-design partitioning postgis postgresql-9.3

我有大量的天气模型数据被放入 PostgreSQL 数据库。该机器具有 8 个内核和 16 GB 的 RAM。我正在使用 PostGIS 2.1 运行 PostgreSQL 9.3。每个表都有不同种类的天气数据(温度、露点、风等)。每个表将有 6-7 列:纬度、经度、点几何、高程、模型相关的日期时间以及 1-2 个感兴趣的数据值。数据将主要按时间和高程查询边界框。每个表将有大约 145,757,360 行(早于现在不再相关的数据将被删除)。我粗略估计每个表的大小约为 10 GB,没有索引。(这是 52 字节的数据加上每行 23 字节的开销)。随着新模型数据可用,数据将定期更新/插入。笔记:

所以我正在研究这两个计划:

  1. 简单地按(日期时间,高程)索引和聚类,并为点几何添加一个额外的索引。运行一个常规的 cron 作业来删除旧行、运行vacuum/analyze 和重新集群。
  2. 按日期时间分区,然后按每个表的高程进行聚类和索引,并在几何上有索引。运行常规的 cron 作业以添加新表并删除旧表。

更远,

  • 所以,我知道删除表和删除和清空表的效率要高得多。但是,否则我会看到性能提升吗?
  • 当所有表将被均匀更新和选择直到删除不相关时,分区是否合适(文档表明分区在只选择其中几个时效果最佳)?

传递数据时,选择会比聚集索引更快吗?如果同时发出多个请求,答案是否会改变?

谢谢你。我希望我提供了所有需要的数据。如果没有让我知道,我会添加它。

小智 1

考虑到所有因素,我会选择选项 2。日期将被均匀地选择,但我猜测对于给定的查询,仅涉及一两个日期分区。遗憾的是,您无法根据地理位置进行聚类并按日期进行分区,而这将是理想的选择。如果边界框足够小,海拔往往与地理位置相关。

考虑到可用的选择,更清洁的数据操作和避免日常清理是一件好事。

使用选项 1交付选择可能会更快,但我怀疑这可能会是一次清洗。使用选项 1,具有相同日期和海拔的记录在一个大聚集索引中彼此靠近放置。使用选项 2,具有相同日期和海拔的记录在许多较小的聚集索引中彼此靠近放置。