我一直在阅读有关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"
答案 0 :(得分:2)
修改强>:
经过以下评论中的一些思考和讨论后,除了“抛出更多硬件”之外,只有合理的建议是“数据仓库”,这意味着:
使用一个或多个聚合表构建数据集市 - 这将满足您的报告需求
建立ETL流程以允许增量数据集市更新。
(但我不能说是否可能基于您的问题描述 - 这需要更深入的分析,尤其是这些查询的商业含义)