【问题标题】:Postgres - temporary file size exceeds temp_file_limitPostgres - 临时文件大小超过 temp_file_limit
【发布时间】:2018-11-30 09:44:18
【问题描述】:

我尝试使用 JDBC 游标 (setFetchSize) 发出读取所有请求(从 tblName 中选择 *)。 postgresql.conf 中的 temp_file_limit 属性为 500 KB。当我执行准备好的语句时,我得到一个 psql 异常 -

org.postgresql.util.PSQLException: 错误: 临时文件大小超过 temp_file_limit (500kB)

PostgreSQL.conf 中的文档说“#limits per-session temp file space”。 https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor 根据此链接,连接必须禁用自动提交,而我没有禁用它。我也这样做了,但我最终遇到了同样的问题。我的理解是,如此大的读取操作在加载到结果集之前会写入临时文件。如果是这种情况,那么使用较低的 temp_file_limit,我将永远无法读取非常大的数据,即使使用游标也是如此。这对于为什么它首先是可配置的没有意义。

将 temp_file_limit 设置为 -1(无限文件大小)为我解决了这个问题。我采用这种方法是否正确?

【问题讨论】:

    标签: postgresql jdbc database-cursor


    【解决方案1】:

    我见过会使用大量空间(有时超过 1TiB)的查询,一直持续到所有可用空间都用完并且其他查询开始崩溃。将其设置为合理(在我们的例子中)100GiB 会保护其他会话。

    将其设置为 500kB 似乎确实毫无意义。

    仅供参考的临时文件不仅用于游标。

    【讨论】:

    • 我读到临时空间也用于按操作排序。我还没有完全探索它们。我会更多地了解这一点。感谢您的信息。
    • 特别指出游标的​​原因是我想了解游标如何处理批量读取。我的想法是游标确实将所有数据写入临时文件,以便提供操作的快照。否则 IMO 将无法做到这一点。如果游标操作不同(每次读取操作从 DB 读取),那么 500 kB 限制应该不是问题。我想确保我的理解是正确的。我是吗?
    • @kishore 我在文档中一目了然,但我怀疑它们的工作方式类似于具有可重复读取隔离级别,所以基本上是表的快照,如果有的话使用旧元组行已更改 - 假设它们不受其他事务提交的影响。我确实在 82GiB 表上打开了游标,获取了几行,并在此操作期间创建了 0 个临时文件。文档意味着它将部分集合保存在内存中。
    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2017-10-23
    • 1970-01-01
    相关资源
    最近更新 更多