在postgresql中有效地更新一个大字符串

时间:2015-08-25 13:01:15

标签: sql postgresql

我出于性能原因缓存大型JSON响应,并讨论是否使用外部文件或postgres中的文本列。后者的问题是,当我必须完全重建缓存时,用于更新表的SQL非常大。

我查看过COPY函数,我可以删除旧行,写出一个CSV文件,然后在替换行中复制,但对我来说感觉很糟糕。

是否有一种有效的方法以高效的方式更新包含大量文本的文本列,而不要求SQL解析器解析一个可笑的长SQL语句?

感谢。

1 个答案:

答案 0 :(得分:1)

使用来自支持服务器端参数绑定的驱动程序的绑定参数("准备好的语句")。参数值作为一个简单的数据块传递,并在线上有一个长度字。这也使错误消息,日志消息等更具可读性。

PgJDBC执行正确的服务器端参数绑定,当然libpq也是如此。许多驱动程序实际上是在客户端进行参数绑定,因此它们仍会生成一个大型语句。

您可以通过运行启用了log_statement = 'all'的预准备语句来确定驱动程序是否正在执行客户端绑定。如果语句看起来像SELECT $1它使用服务器端绑定;如果看起来SELECT 'some_value'使用客户端绑定。

也就是说,解析字符串文字的开销非常低。我怀疑,如果你只做最简单的事情,现实世界的影响将低于你的预期。如果它确实显示出问题的迹象,请解决问题。

请注意,个别值仍限制为1GB。