我在postgresql中有一个包含10个以上Milions Row的表,我想更新一个字段:
update annonce set confirmed = true;
但查询需要很长时间才能执行,如何优化此查询?
答案 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;
因为它是一个布尔值。这将为您做两件事:
如果尚未确认的公告数量与1000万相比较小,您可以将该字段放入索引中,让postgresql使用该索引以便更快地访问。
在较旧版本的postgresql中,自由空间地图的大小是固定的。如果您更新了一个大表,那么无论您配置它多大,都会超出该地图。因此,您必须定期执行VACUUM FULL
,否则数据库使用的磁盘空间将超出您最大的想象力。
答案 3 :(得分:0)
你有三个答案。
他们都错了。
他们都没有考虑NULL
。 NULL
是唯一的,需要在此处考虑!因为,正如你在评论中所揭示的那样:
“确认”是我现在添加的表格字段
根据定义,所有行都有confirmed IS NULL
。 WHERE
条款根本不会有任何帮助,但是花费一点点。
即使我们不知道您刚刚添加了该列,因为它不在您的原始问题中:由于NULL
未被排除,声明必须是:
UPDATE announce
SET confirmed = TRUE
WHERE confirmed IS DISTINCT FROM TRUE
但这对你没有帮助。相反,索引也没有。无论如何,整个表都必须重写。 没有办法。但是,你可以做很多事情来加快速度。
全部取决于有关您未与我们分享的有关您的牌桌的信息。