数据仓库的PostgreSQL优化最佳实践

数据仓库的PostgreSQL优化最佳实践,postgresql,Postgresql,我在网上和印刷版上找到了大量关于如何调整和优化Postgres OLTP应用程序性能的指南,但我还没有找到任何特定于数据仓库应用程序的指南。由于在工作负载的类型上有如此多的差异,我确信在数据库的管理和调优方式上一定会有一些差异 我自己的一些: 我从DDL方面发现,我更自由地使用索引,因为我通常每天只担心一次插入,并且可以通过索引重建进行批量插入 我通常会使用整数代理键来访问通常具有多个自然键的数据,以实现更快的连接 我通常会定义并维护一个非常全面的日期表,该表具有预构建的日期操作(会计日期,而

我在网上和印刷版上找到了大量关于如何调整和优化Postgres OLTP应用程序性能的指南,但我还没有找到任何特定于数据仓库应用程序的指南。由于在工作负载的类型上有如此多的差异,我确信在数据库的管理和调优方式上一定会有一些差异

我自己的一些:

  • 我从DDL方面发现,我更自由地使用索引,因为我通常每天只担心一次插入,并且可以通过索引重建进行批量插入

  • 我通常会使用整数代理键来访问通常具有多个自然键的数据,以实现更快的连接

  • 我通常会定义并维护一个非常全面的日期表,该表具有预构建的日期操作(会计日期,而不是日历日期、会计年度月份、一周的开始日期等),并自由地使用它,而不是在select语句和where语句中使用函数。这通常有助于CPU绑定的聚合查询


我希望能找到一些关于内存管理和其他数据库设置的信息,但我很高兴听到任何关于基于Postgres的数据仓库的有用的最佳实践

从内存管理的角度来看,您最大的区别之一是您通常希望将工作的OLTP集保留在内存中,而OLAP环境则不是这样。此外,您的连接集通常更大。这意味着更高的work_mem设置非常有用,而且在一定程度上表是非规范化的,这意味着可以将work_mem推高一点。我不确定我对共享缓冲区的建议是否会改变(我更喜欢从低到高,在每一步测试性能),但如果您要对任何大小的集合进行报告,则工作内存肯定需要增加。

我的经验(无可否认,在数据仓库方面,规模非常小):

  • 正如您所提到的,预聚合数据很容易成为最重要的事情,因为它将需要读取的数据量减少了许多数量级
  • 避免短写事务、子事务和保存点。这包括PL/pgSQL中的异常处理。这些文件会很快烧掉可用的“事务ID”空间,并导致错误
  • 我发现,如果需要进行维护和迁移,分区表(这样每个分区都可以单独放入内核的缓存)有利于维护和迁移。这意味着您可以在一个分区上重新创建所有索引,只需从磁盘进行一次顺序扫描,而不是对每个索引进行一次扫描
  • 正如Chris已经提到的,慷慨地对待工作和维护工作;如果您的工作负载不适合RAM,那么由于更智能的查询计划(最重要的是HashAggregate),在内存中保留更多的临时数据可以节省I/O和CPU时间
  • 如果您需要进行大量排序,购买专用SSD来存储临时文件会有所帮助

这个问题没有简单的答案。如果您想了解有关调优PostgreSQL的一般知识,我可以推荐以下书籍:(有一章免费提供)让我们知道您是否找到了一些有趣的信息。当我们在时间维度和事实表中将
bigint
更改为
smallint
时,我们的性能有了很大的变化。我建议观看Josh Berkus的精彩演讲“PostgreSQL性能的5个步骤”。这将回答你的许多问题,或者让你接近自己回答它们。