问题

我有一个表,其中包含3个字段(用户名,target_value,分数),由完整的用户名(~400,000)和target_value(~4000)生成,并计算得分,导致总行数约16亿.

我在此表上的所有查询将采用格式

 SELECT *
FROM _table
WHERE target_values IN (123, 456)
 

我的初始版本包括一个关于target_values的BTREE索引,但我最终在索引的位图HEAP SCAN上花费了45分钟. 我也一直在查看Brin索引,分区和表聚类,但由于将每个方法应用于表需要几个小时,我无法完全强制每个选项并测试性能.

postgresql – 处理Postgres 10中非常“blocky”数据的单个大量表有什么建议?

  最佳答案

如果表是两个数据集的交叉连接,为什么不存储单个表并根据需要计算连接?数据库很好.

根据您的描述,如果您在表上运行CLUSTER按索引顺序进行物理重写,我会期望性能增加.然后您必须访问更少的表块.

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

可能更好的替代方法是通过target_value分区表. 4000个分区有点多,所以可能使用列表分区将几个分区绑定到一个分区中.

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

然而,底线是,如果您从表中选择许多行,那么它总是需要很长时间。

  相同标签的其他问题

databasepostgresqlindexingdatabase-partitioning