2009-12-14 71 views
0

我一直在阅读一些关于postgres内存分配配置的文档,但需要一些帮助。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" 

回答

2
  1. work_mem 相关。不过,请记住它是每个操作。
  2. 确保您需要索引到位。
  3. 解释分析是你的朋友。你可以在这里发布吗?
  4. 磁盘设置(物理)在这里很重要。如果你可以使用更多的锭子,使用它们。
  5. 最好的文档都一如既往,herehere (if you write a lot)
  6. (勇敢的感觉),你确定你需要一个RDBMS在这里?

编辑

在下面的评论的一些思考和讨论之后,除“投入更多的硬件”唯一合理的建议是“数据仓库”,这意味着:

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

  • 建立ETL流程以允许增量d ata市场更新。

(但我不能说,如果这是你的问题的描述可能筑底 - 这需要更深入的分析,特别是这些查询的业务含义)

+2

只是要非常清楚 - work_mem是*不是*每个连接,它是每个*操作*。所以每个连接可能会有超过1 x work_mem。 – 2009-12-14 14:18:05

+0

1.碰到work_mem高达10Mb,2.我认为我有,3.上面添加的问题,4.我们正在努力获得新硬件的访问权限,但目前在单个SATA磁盘上,5. thx,6。跆拳道?很确定我没有替代品。 – pstanton 2009-12-14 19:53:04

+0

增加work_mem是否有可能减慢处理速度,即使它没有达到交换点?我只使用我的记忆的第三,但如果有什么我注意到放缓! – pstanton 2009-12-17 09:40:50