如何提高 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 查询结果时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高此 PostgreSQL 查询在索引扫描中的性能

PostgreSQL:更新...缺少插入?

EXTENDED STATISTICS 对 PostgreSQL 中的 INSERT/UPDATE/DELETE 有影响吗?

如何检查 PostgreSQL 事务中的待处理操作

如何修改新 PostgreSQL JSON 数据类型中的字段?

如何比较 Postgresql 中日期时间字段中的日期?