具有复杂查询和相当大数据集的本地服务器上的 PostgreSQL 超时
PostgreSQL timeouts on local server with complex query and fairly large dataset
背景
我的机器上有一个 PostgreSQL 本地服务器,其中包含大量关于汽车和摩托车保险的数据运行我需要为统计分析做准备。我正在 运行 宁一个相当复杂的查询,涉及 3 个不同表上的多个连接,其中一个有 ~100m 行,另外两个有 ~30k 左右的行。所有表格都有 < 15 列。注意,这个查询实际上是包裹在一个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 中查看了有关此错误消息的提及,并且找到了它们。但在我见过的每一种情况下,用户都是在网络上的 Postgres 服务器(例如 Amazon Redshift)中遇到这种情况,而不是在他们的本地机器上遇到这种情况,比如我的 (this is an example)。
这可能有点含糊。我很高兴 post 查询的匿名版本以供检查(上帝知道它可能会被优化为 运行 更快),但同样,我很确定查询本身不是问题在这里。 (我想运行我可能是错的。)
我在想什么
我从阅读其他类似 posts 的感觉是,这与我服务器端的某种超时有关,但我不确定如果查询仍然 运行ning(即如果服务器仍然被要求做一些事情)。
有什么想法吗?
在 OP 澄清后,很明显 DataGrip 将 statement_timeout
设置为不足以完成查询的值。
解决方案
手动关闭脚本顶部的语句超时:
SET statement_timeout = 0
备注
我手头没有DataGrip
,但我想这个会话参数应该可以为数据库连接配置。
检查documentation/forums。
背景
我的机器上有一个 PostgreSQL 本地服务器,其中包含大量关于汽车和摩托车保险的数据运行我需要为统计分析做准备。我正在 运行 宁一个相当复杂的查询,涉及 3 个不同表上的多个连接,其中一个有 ~100m 行,另外两个有 ~30k 左右的行。所有表格都有 < 15 列。注意,这个查询实际上是包裹在一个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 中查看了有关此错误消息的提及,并且找到了它们。但在我见过的每一种情况下,用户都是在网络上的 Postgres 服务器(例如 Amazon Redshift)中遇到这种情况,而不是在他们的本地机器上遇到这种情况,比如我的 (this is an example)。
这可能有点含糊。我很高兴 post 查询的匿名版本以供检查(上帝知道它可能会被优化为 运行 更快),但同样,我很确定查询本身不是问题在这里。 (我想运行我可能是错的。)
我在想什么
我从阅读其他类似 posts 的感觉是,这与我服务器端的某种超时有关,但我不确定如果查询仍然 运行ning(即如果服务器仍然被要求做一些事情)。
有什么想法吗?
在 OP 澄清后,很明显 DataGrip 将 statement_timeout
设置为不足以完成查询的值。
解决方案
手动关闭脚本顶部的语句超时:
SET statement_timeout = 0
备注
我手头没有DataGrip
,但我想这个会话参数应该可以为数据库连接配置。
检查documentation/forums。