我有以下查询运行3小时+:
UPDATE eop_201007
set coord_x = gi.x_etrs89, coord_y = gi.x_etrs89,gr_type = 4
from eop_201007 as eop, geoindex201001 as gi
where eop.cp7=gi.cp7 AND eop.gr_type=0;
eop表有300k +记录,gi表有100k +。
cp7字段在两个表中都被编入索引,这需要花费太多时间才能完成。
我做错了吗?我怎样才能改善这个?
答案 0 :(得分:1)
检查this topic并使用EXPLAIN查看发生了什么。 WAL的更好配置也可能有所帮助,只需在更新期间检查内存使用情况和写入速度。
编辑:并确保没有其他交易锁定你的桌子,你必须永远等待......
SELECT
relname,
*
FROM
pg_locks
JOIN pg_class ON pg_locks.relation = pg_class.oid
答案 1 :(得分:1)
您的FROM中不需要“eop_201007 as eop”。以下内容适用:
UPDATE eop_201007
set coord_x = gi.x_etrs89, coord_y = gi.x_etrs89,gr_type = 4
from geoindex201001 as gi
where eop_201007.cp7=gi.cp7 AND eop_201007.gr_type=0;
我认为额外的eop导致交叉连接(基本上是两个表的交叉产品,这是巨大的),因为它不受原始eop表的约束,这是在FROM列表中已经“自动”
如果这不能解决问题,可以采取其他一些想法:
如果你没有,你可能想先对它进行真空分析。确保你在postgresql.conf中调整了所有内存设置。工作记忆,共享缓冲区等可以产生巨大的差异。
如果这是一次性的事情,而不是夜间工作,你应该关闭fsync。此外,请确保(如果关闭fsync)您没有配置太多检查点段(24个左右),否则您将污染磁盘缓存。
正如@Frank Heikens所说,你应该看看解释。还要检查EXPLAIN ANALYZE(如果你的查询完成了)。