postgres内存分配调优

时间:2009-12-14 03:31:57

标签: postgresql memory-management

我一直在阅读有关postgres内存分配配置的几个文档,但需要一些帮助。

我的进程会运行数千个SELECT SUM(x) FROM tbl WHERE ???类型的查询,其中一些查询需要10-30秒才能运行。在某些情况下,这些查询的总和为多天。

除此之外,我还有一些语句以下列形式填充原始表中的汇总表:INSERT INTO sum_tbl SELECT FROM raw_tbl WHERE ??? GROUP BY ???

由于原始表非常大(最多可达4000万行),因此这些摘要查询可能需要数小时才能运行。

该进程是单线程的,因此一次只运行一个查询,但是我一次最多运行4个进程,这意味着只有1-4个并发连接。

计算机有3.2 GB RAM,大部分是免费的。

考虑到所有这些,哪种内存设置最适用?

我的理解是work_mem看起来最相关。

感谢。

编辑 - 添加查询类似查询运行1053000次

"Nested Loop  (cost=0.00..62869.18 rows=6 width=17) (actual time=1812.655..32761.845 rows=30 loops=1)"
"  ->  Seq Scan on table2 tt  (cost=0.00..1103.74 rows=2212 width=5) (actual time=0.017..29.231 rows=1527 loops=1)"
"        Filter: (pp AND (dd = 1200::numeric) AND ((type)::text = 'setup'::text))"
"  ->  Index Scan using idx_table1 on table1 t  (cost=0.00..27.91 rows=1 width=20) (actual time=21.432..21.432 rows=0 loops=1527)"
"        Index Cond: ((t.t_id = tt.id) AND (t.st = 520000::numeric) AND (t.ta = 2300000::numeric))"
"        Filter: (date_trunc('month'::text, t.start) = '2004-03-01 00:00:00'::timestamp without time zone)"
"Total runtime: 32761.983 ms"

1 个答案:

答案 0 :(得分:2)

  1. work_mem 相关。但是,请记住每次操作。
  2. 确保您已安装索引
  3. 解释分析是你的朋友。你能把它贴在这里吗?
  4. 磁盘设置(物理)在这里很重要。如果你可以使用更多的锭子,请使用它们。
  5. 最佳文档一如既往地herehere (if you write a lot)
  6. (感到勇敢)你确定需要一个RDBMS 吗?
  7. 修改

    经过以下评论中的一些思考和讨论后,除了“抛出更多硬件”之外,只有合理的建议是“数据仓库”,这意味着:

    • 使用一个或多个聚合表构建数据集市 - 这将满足您的报告需求

    • 建立ETL流程以允许增量数据集市更新。

    (但我不能说是否可能基于您的问题描述 - 这需要更深入的分析,尤其是这些查询的商业含义)