我在 postgresql 中有一个包含超过 10 百万行的表,我想更新一个字段:
update annonce set confirmed = true;
但是查询需要很长时间才能执行,我该如何优化这个查询?
我在 postgresql 中有一个包含超过 10 百万行的表,我想更新一个字段:
update annonce set confirmed = true;
但是查询需要很长时间才能执行,我该如何优化这个查询?
update annonce set confirmed = true
where not confirmed
部分索引可以帮助:
create index index_name on annonce (confirmed)
where not confirmed
与完整索引相比,部分索引将大大减少索引大小,并使所有更新、删除和插入操作更快。
如果你经常这样做,你想稍微修改一下,如下所示:
UPDATE announce
SET confirmed = TRUE
WHERE NOT confirmed
此外,您应该在(confirmed)
.
今天,您每次都在更改整个表,这会产生很多死行 - 基本上表是臃肿的。使用建议的方法,您只会为新记录创建死行,甚至会被索引 - 非常快速和高效。
你可以说
update announce set confirmed = true where confirmed = false;
因为它是一个布尔值。这将为您做两件事:
如果尚未确认的公告数量比 1000 万还少,可以将字段放入索引中,让 postgresql 使用该索引来更快地访问。
在旧版本的 postgresql 中,可用空间图具有固定大小。如果您更新了一张大表,那么无论您配置多大的地图,您都会超出该地图。因此,您必须定期执行VACUUM FULL
,否则数据库使用的磁盘空间将超出您的想象。
到目前为止,您已经得到了三个答案。
他们都错了。
他们都没有考虑NULL
。并且NULL
是这里唯一需要考虑的事情!因为,正如你在评论中透露的那样:
“已确认”是我现在添加的表格字段
根据定义,所有行都有confirmed IS NULL
。一个WHERE
条款根本没有帮助,只是要花一点钱。
即使我们不知道您刚刚添加了该列,因为它不在您的原始问题中:由于NULL
尚未排除,该声明必须是:
UPDATE announce
SET confirmed = TRUE
WHERE confirmed IS DISTINCT FROM TRUE
但这对你没有帮助。索引也没有- 相反。无论如何,整个表都必须重写。没有办法解决它。但是,您可以做很多事情来加快速度。
这完全取决于您未与我们分享的有关您的餐桌的信息。