如何在Postgresql中提高UPDATE查询结果时间?

时间:2010-08-17 10:43:52

标签: postgresql query-optimization postgis

我有以下查询运行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字段在两个表中都被编入索引,这需要花费太多时间才能完成。

我做错了吗?我怎样才能改善这个?

2 个答案:

答案 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(如果你的查询完成了)。