如何提高 Postgresql 中的 UPDATE 查询结果时间?
Posted
技术标签:
【中文标题】如何提高 Postgresql 中的 UPDATE 查询结果时间?【英文标题】:How to Improve UPDATE query result time in Postgresql? 【发布时间】:2010-08-17 10:43:51 【问题描述】:我有以下查询运行了 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 字段在两个表中都有索引,这需要太多时间才能完成。
我做错了吗?我该如何改进?
【问题讨论】:
【参考方案1】:检查this topic 并使用 EXPLAIN 查看发生了什么。 WAL 的更好配置可能也会有所帮助,只需在更新期间检查内存使用情况和写入速度即可。
编辑:并确保没有其他事务锁定您的表,您必须永远等待......
SELECT
relname,
*
FROM
pg_locks
JOIN pg_class ON pg_locks.relation = pg_class.oid
【讨论】:
【参考方案2】:您的 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 会导致交叉连接(基本上是两个巨大的表的交叉产品),因为它不受 FROM 列表中“自动”的原始 eop 表的约束
如果这不能解决问题,这里有一些其他想法:
如果您还没有,您可能想先对其进行真空分析。确保在 postgresql.conf 中调整了所有内存设置。工作内存、共享缓冲区等可以产生巨大的影响。
如果这是一次性的事情,而不是每晚的工作,您应该关闭 fsync。另外,请确保(如果您关闭 fsync)您没有配置太多的检查点段(大约 24 个),否则您会污染磁盘缓存。
正如@Frank Heikens 所说,你应该看看解释。还要检查 EXPLAIN ANALYZE(如果您的查询确实完成了)。
【讨论】:
如果您使用 EXPLAIN ANALYZE,请确保您在事务中执行此操作! UPDATE 将由 EXPLAIN ANALYZE 执行,它不仅仅是您获得的查询计划。小心。 输入 mike 和 Frank 的 Ty。我现在正在尝试内存调整部分,因为查询似乎仍在运行。 瑞,你能把解释计划贴一下吗? (没有分析)以上是关于如何提高 Postgresql 中的 UPDATE 查询结果时间?的主要内容,如果未能解决你的问题,请参考以下文章
EXTENDED STATISTICS 对 PostgreSQL 中的 INSERT/UPDATE/DELETE 有影响吗?