尽管查询是<而且在hstore查询中超出了PostgreSQL堆栈深度限制。 2 MB

时间:2016-04-07 15:42:28

标签: r postgresql stack-size

我在尝试存储从stack depth limit exceededR的行时遇到PostgreSQL。为了解决批量upserts,我一直在使用这样的查询:

sql_query_data <- sprintf("BEGIN;
                        CREATE TEMPORARY TABLE 
                          ts_updates(ts_key varchar, ts_data hstore, ts_frequency integer) ON COMMIT DROP;
                          INSERT INTO ts_updates(ts_key, ts_data) VALUES %s;
                          LOCK TABLE %s.timeseries_main IN EXCLUSIVE MODE;

                          UPDATE %s.timeseries_main
                          SET ts_data = ts_updates.ts_data,
                          ts_frequency = ts_updates.ts_frequency
                          FROM ts_updates
                          WHERE ts_updates.ts_key = %s.timeseries_main.ts_key;

                          INSERT INTO %s.timeseries_main
                          SELECT ts_updates.ts_key, ts_updates.ts_data, ts_updates.ts_frequency
                          FROM ts_updates
                          LEFT OUTER JOIN %s.timeseries_main ON (%s.timeseries_main.ts_key = ts_updates.ts_key)
                          WHERE %s.timeseries_main.ts_key IS NULL;
                          COMMIT;",
                          values, schema, schema, schema, schema, schema, schema, schema)

}

到目前为止,这个查询在保持插入数量较少的同时更新了数百万条记录的效果非常好。每当我遇到堆栈大小问题到目前为止,我只是将我的记录分成多个块并从那里继续。

然而,这种策略现在面临一些麻烦。我不再有很多记录了,但是少数hstore更大一些。但无论如何,它并不是真的“大”。我读了@Craig Ringer的建议,他建议不要接近1GB的限制。所以我假设hstore本身的大小不是问题,但我收到这条消息:

Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: stack depth limit exceeded HINT: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate. )

编辑:我确实将限制增加到7 MB并遇到了同样的错误,说明7 MB是不够的。这对我来说真的很奇怪,因为我查询本身只有1.7 MB(通过将其粘贴到文本文件来检查它)。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

按照提示的建议增加max_stack_depth。 [来自官方文档] (http://www.postgresql.org/docs/9.1/static/runtime-config-resource.html):

  

此参数的理想设置是内核强制实际的堆栈大小限制(由ulimit -s或本地等效项设置),减去一兆字节左右的安全范围。

  

默认设置是2兆字节(2MB),保守地小,不太可能冒着崩溃的风险。

超级用户可以为每个连接更改此设置,也可以通过postgresql.conf文件为所有用户设置(需要postgres服务器重启)。