我有一个具有数百万条记录的PostgreSQL表。我需要处理每一行,为此,我正在该表中使用一列,即'isProcessed',因此默认情况下为false,当我对其进行处理时,将其更改为true

现在的问题是,有太多的记录,并且由于异常,代码会绕过某些记录,使它们保留为isProcessed=false,这使执行速度确实很慢。

我当时在考虑使用索引编制,但使用布尔值却无济于事。

请提供一些优化技术或一些更好的做法。

更新:

我没有代码,这只是同事们在征求我意见的一个问题。

最佳答案

通常,在布尔值上创建索引不是一个好主意,但是在PostgreSQL中,您可以使用部分索引http://www.postgresql.org/docs/9.3/interactive/indexes-partial.html在其中仅包含一个值条目的索引中进行索引。最终将要排成一堆的事情供您处理,完成后项目会掉落。

CREATE INDEX "yourtable_isProcessed_idx" ON "public"."yourtable"
USING btree ("isProcessed")
WHERE (isProcessed IS NOT TRUE);


在寻找下一个要处理的物品时,这将使生活更轻松。理想情况下,一次应该处理多个,特别是如果您可以在单个查询中进行处理,尽管一次执行数百万个操作可能会令人望而却步。在这种情况下,您也许可以

update yourtable
set ....
where id in (select  id from yourtable where isProcessed = false limit 100 )


如果您一次只能做一件事情,我仍然会限制您检索的内容,因此有可能

select id from yourtable where iProcessed = false limit 1

10-07 19:53
查看更多