背景
我的机器上有一个PostgreSQL本地服务器,其中包含大量关于汽车和摩托车保险的数据,我需要为统计分析做准备。我正在运行一个相当复杂的查询,涉及3个不同表上的多个联接,其中一个表有大约100米的行,另两个表大约有30万行。所有表都具有<15列。请注意,这个查询实际上被封装在COPY TO
语句中,因为我想将结果输出到CSV文件中,以便稍后在R
中导入和分析。
我的机器是一台64位Windows 10 Pro机器,有6个核心和32gb的RAM。我在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和谷歌上查找了关于这个错误消息的内容,并找到了它们。但在我看到的每一个案例中,用户都会在网络上的Postgres服务器上遇到这种情况(例如Amazon Redshift),而不是在他们的本地机器上,比如我的机器上(这是一个例子)。
这可能有点含糊。我很高兴发布一个匿名版本的查询以供检查(天知道它可能会被优化以运行得更快),但我再次确信查询本身不是问题所在。(我承认我可能错了。)
我的想法
从阅读其他类似的帖子中,我的感觉是,这与我的服务器端的某种超时有关,但我不确定如果查询仍在运行(即,如果服务器仍被要求做一些事情),为什么会发生这种情况。
有什么想法吗?
在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-