からまでstack depth limit exceeded
の行を保存しようとすると、に遭遇します。一括アップサートに対処するために、次のようなクエリを使用しています。R
PostgreSQL
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
少し大きいものはほんの一握りです。しかし、決して「大きい」わけではありません。1GBの制限に近づかないようにアドバイスする@Craig Ringerによる提案を読みました。したがって、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 (テキスト ファイルに貼り付けて確認しました) しかないので、これは私にとって非常に奇妙です。誰でもこれに光を当てることができますか?