0

からまでstack depth limit exceededの行を保存しようとすると、に遭遇します。一括アップサートに対処するために、次のようなクエリを使用しています。RPostgreSQL

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 (テキスト ファイルに貼り付けて確認しました) しかないので、これは私にとって非常に奇妙です。誰でもこれに光を当てることができますか?

4

1 に答える 1