0

我在 postgresql 中有一个包含超过 10 百万行的表,我想更新一个字段:

update annonce set confirmed = true;

但是查询需要很长时间才能执行,我该如何优化这个查询?

4

4 回答 4

3
update annonce set confirmed = true
where not confirmed

部分索引可以帮助:

create index index_name on annonce (confirmed)
where not confirmed

与完整索引相比,部分索引将大大减少索引大小,并使所有更新、删除和插入操作更快。

于 2013-03-25T17:41:59.997 回答
1

如果你经常这样做,你想稍微修改一下,如下所示:

UPDATE announce
SET confirmed = TRUE
WHERE NOT confirmed

此外,您应该在(confirmed).

今天,您每次都在更改整个表,这会产生很多死行 - 基本上表是臃肿的。使用建议的方法,您只会为新记录创建死行,甚至会被索引 - 非常快速和高效。

于 2013-03-25T17:42:12.920 回答
0

你可以说

update announce set confirmed = true where confirmed = false;

因为它是一个布尔值。这将为您做两件事:

  1. 如果尚未确认的公告数量比 1000 万还少,可以将字段放入索引中,让 postgresql 使用该索引来更快地访问。

  2. 在旧版本的 postgresql 中,可用空间图具有固定大小。如果您更新了一张大表,那么无论您配置多大的地图,您都会超出该地图。因此,您必须定期执行VACUUM FULL,否则数据库使用的磁盘空间将超出您的想象。

于 2013-03-25T17:46:57.690 回答
0

到目前为止,您已经得到了三个答案。

他们都错了。

他们都没有考虑NULL。并且NULL是这里唯一需要考虑的事情!因为,正如你在评论中透露的那样:

“已确认”是我现在添加的表格字段

根据定义,所有行都有confirmed IS NULL。一个WHERE条款根本没有帮助,只是要花一点钱。

即使我们知道您刚刚添加了该列,因为它不在您的原始问题中:由于NULL尚未排除,该声明必须是:

UPDATE announce
SET    confirmed = TRUE
WHERE  confirmed IS DISTINCT FROM TRUE

但这对你没有帮助。索引也没有- 相反。无论如何,整个表都必须重写。没有办法解决它。但是,您可以做很多事情来加快速度。

完全取决于您未与我们分享的有关您的餐桌的信息。

于 2013-03-25T21:44:36.397 回答