(Postgre)SQL更新查询不返回
我有一个简单的更新查询(在两个大表上),它永远不会完成(Postgre)SQL更新查询不返回,sql,postgresql,Sql,Postgresql,我有一个简单的更新查询(在两个大表上),它永远不会完成 UPDATE transit_edge te1 SET dates_to_add = ( SELECT ARRAY_AGG(date) FROM transit_edge te2 LEFT OUTER JOIN calendar_dates cd2 ON (te2.service_id = cd2.service_id AND cd2.exception_type = 1) WHERE te2.transit_edge_
UPDATE transit_edge te1 SET dates_to_add =
( SELECT ARRAY_AGG(date)
FROM transit_edge te2 LEFT OUTER JOIN calendar_dates cd2 ON (te2.service_id = cd2.service_id AND cd2.exception_type = 1)
WHERE te2.transit_edge_id = te1.transit_edge_id
);
如果我只使用给定的id运行内部查询,我会得到正确的结果
SELECT ARRAY_AGG(date)
FROM transit_edge te2 LEFT OUTER JOIN calendar_dates cd2 ON (te2.service_id = cd2.service_id AND cd2.exception_type = 1)
WHERE te2.transit_edge_id = te1.transit_edge_id AND te1.transit_edge_id = 282956
表计数相当高:
select count(*) from transit_edge;
count
---------
9187885
select count(*) from calendar_dates;
count
----------
10025969
我还更新了postgresql.conf以实现更大的内存使用
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
# - Memory -
shared_buffers = 2GB
work_mem = 200MB
checkpoint_segments = 3
max_connections = 100
maintenance_work_mem = 64MB
我运行了限制为100的内部查询,得到了以下错误消息
ERROR: invalid memory alloc request size 1073741824
非常感谢您的帮助!
丹尼尔尝试使用以下方法:
UPDATE transit_edge te1 SET dates_to_add =
( SELECT ARRAY_AGG(date)
FROM calendar_dates cd2
WHERE te1.service_id = cd2.service_id AND cd2.exception_type = 1
);
有没有办法看看是否真的发生了什么,或者我必须等到完整的查询完成?DanielGerber您可以将外部(
更新
)查询限制为id的一小部分(,其中te1.transit_edge_id in(1,2,3等)
)来检查结果。如果结果正常-继续执行完整查询。@CraigRinger如果查询做了一些愚蠢的事情(例如由于缺少联接条件而导致笛卡尔积),则可能没有帮助。此查询似乎会返回结果。但是对于左外部联接,这真的是同一个查询吗?EXPLAIN
对于从未完成的查询的输出?尝试了这个,但是我也没有得到EXPLAIN的输出。EXPLAIN
没有输出?没有分析
?这表明它正陷入计划之中,而这不应该发生。精确的PostgreSQL版本来自SELECT version()
?x86_64-unknown-linux-gnu上的PostgreSQL 9.3.5,由gcc(Debian 4.7.2-5)4.7.2编译,64位。。。一个简单的解释更新…
无限期挂起?是否有任何与pg_锁相关的内容?postgres后端(在运行解释更新之前通过运行选择pg\u backend\u pid()
来识别…
)是否使用100%的CPU?