我使用Postgresql 9.4作为模型数据库.我的表看起来有点像这样:
CREATE TABLE table1 ( sid INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('table1_sid_seq'::regclass), col1 INT, col2 INT, col3 JSONB);
我的Python 2.7工作流通常如下所示:
curs.execute("SELECT sid, col1, col2 FROM table1") data = curs.fetchall() putback = [] for i in data: result = do_something(i[1], i[2]) putback.append((sid, result)) del data curs.execute("UPDATE table1 SET col3 = p.result FROM unnest(%s) p(sid INT, result JSONB) WHERE sid = p.sid", (putback,))
这通常可以很好地有效地工作.但是,对于大型查询,Postgresql内存使用有时会在UPDATE
命令期间通过屋顶(> 50GB),我相信它正被OS X杀死,因为我得到了WARNING: terminating connection because of crash of another server process
.我的Macbook Pro有16GB的RAM,有问题的查询有11M行,每行大约有100个字符要回写.
我的postgresql.conf
:
default_statistics_target = 50 maintenance_work_mem = 512MB constraint_exclusion = on checkpoint_completion_target = 0.9 effective_cache_size = 4GB work_mem = 256MB wal_buffers = 16MB checkpoint_segments = 128 shared_buffers = 1024MB max_connections = 80
所以我想知道
为什么我的查询有时消耗过多的RAM?
如何控制内存使用并仍能保证良好的性能?
是否有一个很好的指导或工具来调整Postgresql?
更新:
我很确定@wildplasser查明了我的问题.在评论中,他建议首先将数据转储到数据库中,然后从那里解压缩.不幸的是,我无法弄清楚如何实施他的提议.如果有人知道如何做到这一点,他们的答案将很乐意接受.