具有复杂查询和相当大数据集的本地服务器上的 PostgreSQL 超时

Posted

技术标签:

【中文标题】具有复杂查询和相当大数据集的本地服务器上的 PostgreSQL 超时【英文标题】:PostgreSQL timeouts on local server with complex query and fairly large dataset 【发布时间】:2021-10-26 04:18:27 【问题描述】:

背景

我的机器上有一个 PostgreSQL 本地服务器,其中包含大量关于汽车和摩托车保险的数据,我需要为统计分析做准备。我正在运行一个相当复杂的查询,涉及 3 个不同表上的多个连接,其中一个有大约 100m 行,另外两个有大约 30k 行。所有表都有 COPY TO 语句中,因为我想将结果输出到一个CSV 文件,以便以后在R 中导入和分析。

我的机器是 64 位 Windows 10 Pro 机器,有 6 个内核和 32gb 内存。我在 DataGrip 中运行我的 Postgres 查询(因为我比 PGAdmin 更喜欢 GUI)。一开始我应该说我是一个 RDBMS 新手。 Postgres 版本是 13.3。

问题

这个有问题的大查询,大约 100 行代码,需要很长时间才能运行,这在真空中很好 - 我有时间等待。我已经在一个小的虚拟数据集上测试了查询,所以我知道它有效。但是当我在“真实”数据上运行它时,它运行了两个小时正好然后吐出这个错误:

[Date] completed in 2 h 0 m 0 s 15 ms
[Date] Error unmarshaling return header; nested exception is:
[Date]  java.net.SocketException: Connection reset

现在,我在 SO 和 Google 中查看了有关此错误消息的提及,并且我找到了它们。但在我见过的每一种情况下,用户都是在 Web 上的 Postgres 服务器(例如 Amazon Redshift)上遇到这种情况,而不是在他们的本地机器上遇到这种情况,比如我的 (this is an example)。

这可能有点模糊。我很高兴发布查询的匿名版本以供检查(上帝知道它可能会被优化以更快地运行),但我很确定查询本身不是这里的问题。 (我承认我可能错了。)

我在想什么

从阅读其他类似帖子中我的感觉是,这与我的服务器端的某种超时有关,但我不确定如果查询仍在运行(即如果服务器仍在运行)为什么会发生这种情况被要求做事)。

有什么想法吗?

【问题讨论】:

你看过这里吗:dba.stackexchange.com/questions/164419/…?您的服务器可能具有statement_timeout 的非默认值。但是您可以随时使用 SET statement_timeout = 0 将其关闭 “它可能会被优化以更快地运行” - 很可能应该可以优化您的查询和/或部分溢出 - 所以发布详细信息。另一个:尝试使用 psql 运行繁重的查询。当默认设置关闭查询并行性时,我记得 IntelliJ IDE 的奇怪情况。 这看起来像是网络问题。 psql 是一个用于 postgresql 的命令行工具。如果您对客户端有怀疑:首先 - 尝试使用 psql 这是一个非常不具信息性的错误消息。查看服务器的日志文件,看看它是否有更多信息。 【参考方案1】:

在 OP 澄清后,很明显 DataGrip 将 statement_timeout 设置为不足以完成查询的值。

解决方案

在脚本顶部手动关闭语句超时:

SET statement_timeout = 0

注意事项

我手头没有DataGrip,但我想这个会话参数应该可以为数据库连接配置。

查看文档/论坛。

也许这会起作用:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360010315600-Setting-a-session-variable-for-a-Postgres-connection-

【讨论】:

以上是关于具有复杂查询和相当大数据集的本地服务器上的 PostgreSQL 超时的主要内容,如果未能解决你的问题,请参考以下文章

Hive简介

用于 Web 应用程序的大型数据集 - 为每个查询使用 API 或本地存储在数据库中?

离散数学关于粗糙集的讨论

大表上的第一次查询调用速度非常慢

具有大型(70,000+ 项)数据集的高效 jQuery 实时搜索

具有庞大数据集的数据库结构的建议