【问题标题】:Heroku Postgres: Out of memory error with work_mem settings on maxHeroku Postgres:最大的work_mem设置出现内存不足错误
【发布时间】:2021-12-27 15:47:48
【问题描述】:

我对 Heroku Postgres 的计划是 8GB RAM。

我尝试使用“order by”运行查询,但内存不足!

我尝试将 work_mem 设置为 2GB,然后设置为 4GB 并得到相同的错误。

ALTER DATABASE xxxx  SET work_mem = '4096MB';

直到最近,所有问题都很好,但突然一切都卡住了。

将计划升级到 15RAM 并将 work_mem 设置为 8GB 后,我得到了同样的错误。 Heroku 支持建议将“temp_tablespaces”设置为“pg_default”,但我再次遇到同样的错误

ALTER DATABASE xxxx SET work_mem = '8192MB';
ALTER DATABASE xxxx SET temp_tablespaces = 'pg_default';

我不明白服务器发生了什么,Heroku 支持并没有真正帮助。 可能是什么问题?

【问题讨论】:

  • 您正在检索整个表,并且您似乎在强制引擎首先在内存中实现整个结果集。最简单的解决方案是在public.table (created_at) 上添加索引。这将允许引擎流水线化结果集并避免内存分配。
  • @The Impaler 这是索引列“created_at”
  • 请将执行计划添加到问题中。
  • @The_impaler 您的回答不完整。该索引无济于事,因为它只有 created_by 列。对于 SELECT *,您必须在索引中拥有完整的表,这可以通过 CLUSTER 索引或具有 INCLUDE 子句的索引来实现,该子句包含表中除 create at 之外的所有其他列

标签: database postgresql heroku


【解决方案1】:

work_mem单个查询可以分配多次,可以有多个并发查询。此外,分配给shared_buffers 的内存也必须考虑在内。

work_mem 使用更小的设置。

【讨论】:

    【解决方案2】:

    你走错了方向。您正在授予它您的使用更多内存的权限,但是当它尝试使用它时,系统将它撞在头上,因为内存不存在使用。您需要告诉您的会话使用更少的内存,而不是更多。然后它将切换到磁盘排序,而不是尝试在 RAM 中完成所有操作。

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2014-05-10
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多