Database 大型博士后表格的最佳实践

Database 大型博士后表格的最佳实践,database,postgresql,indexing,database-partitioning,Database,Postgresql,Indexing,Database Partitioning,我有一个包含3个字段(用户名、目标值、分数)的表,由用户名(~400000)和目标值(~4000)的完全交叉以及计算的分数在外部生成,导致行总数约为16亿 此表上的所有查询都将采用 SELECT * FROM _table WHERE target_values IN (123, 456) 我的初始版本包括一个针对目标值的BTREE索引,但最后我花了45分钟对索引进行位图堆扫描。 我也一直在研究BRIN索引、分区和表集群,但由于将每种方法应用于表需要几个小时,因此我无法确切地强制每个选项并测试

我有一个包含3个字段(用户名、目标值、分数)的表,由用户名(~400000)和目标值(~4000)的完全交叉以及计算的分数在外部生成,导致行总数约为16亿

此表上的所有查询都将采用

SELECT *
FROM _table
WHERE target_values IN (123, 456)
我的初始版本包括一个针对目标值的BTREE索引,但最后我花了45分钟对索引进行位图堆扫描。 我也一直在研究BRIN索引、分区和表集群,但由于将每种方法应用于表需要几个小时,因此我无法确切地强制每个选项并测试性能


对于处理Postgres 10中包含非常“块状”数据的单个海量表,有哪些建议?

如果该表是两个数据集的交叉联接,为什么不存储各个表并根据需要计算联接?数据库擅长于此

根据您的描述,如果您在表上运行
CLUSTER
,以索引顺序对其进行物理重写,我希望性能有所提高。然后您将不得不访问更少的表块

不幸的是,
CLUSTER
将花费很长时间,使表不可用,并且必须定期重复

另一种可能更好的方法是通过
target\u value
对表进行分区。4000个分区有点多,所以可以使用列表分区将多个分区捆绑到一个分区中

这将允许您的查询仅在几个分区上执行快速顺序扫描。这也将使自动真空吸尘器的工作更容易


然而,底线是,如果您从一个表中选择了很多行,这将总是需要很长时间。

遗憾的是,分数生成是由Spark使用ML模型在外部完成的,因此我无法动态存储和计算。顺便问一句,您有推荐的分区数最大值吗?50? 100? 500?PostgreSQL版本越高,可以有效处理的分区就越多。使用昨天发布的v12,您可能可以处理4000个分区。你应该运行一些测试。许多分区的问题是规划时间可能会增加很多。