我有一个包含数百万条记录的 PostgreSQL 表。我需要处理每一行,为此我使用该表中的一列,即 'isProcessed'
所以默认情况下它是 false
,当我处理它时,我将其更改为 true
。
现在的问题是记录太多,并且由于异常,代码绕过了一些记录,留下了 isProcessed=false
,这使得执行速度非常慢。
我想使用索引,但使用 boolean 值没有帮助。
请提供一些优化技巧或一些更好的实践。
更新:
我没有代码,这只是我的同事询问我意见的问题。
最佳答案
通常, boolean 值上的索引不是一个好主意,但在 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
关于java - 优化从大表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25210475/