优化postgresql更新

时间:2013-03-25 17:30:53

标签: sql postgresql

我在postgresql中有一个包含10个以上Milions Row的表,我想更新一个字段:

update annonce set confirmed = true;

但查询需要很长时间才能执行,如何优化此查询?

4 个答案:

答案 0 :(得分:3)

update annonce set confirmed = true
where not confirmed

部分索引可以提供帮助:

create index index_name on annonce (confirmed)
where not confirmed

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

答案 1 :(得分:1)

如果您经常这样做,您需要稍微修改一下,如下所示:

UPDATE announce
SET confirmed = TRUE
WHERE NOT confirmed

此外,您应该在(confirmed)上创建索引。

今天,你每次都在改变整个表格,这会产生很多死行 - 基本上表格是膨胀的。使用提出的方法,您将只为新记录创建死行,甚至可以将其编入索引 - 非常快速和高效。

答案 2 :(得分:0)

你可以说

update announce set confirmed = true where confirmed = false;

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

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

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

答案 3 :(得分:0)

你有三个答案。

他们都错了。

他们都没有考虑NULLNULL唯一的,需要在此处考虑!因为,正如你在评论中所揭示的那样:

  

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

根据定义,所有行都有confirmed IS NULLWHERE条款根本不会有任何帮助,但是花费一点点。

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

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

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

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