我需要使用自定义的ElasticSearch实现定期重新为实时遗留数据库中的所有域实例重新编制索引。Grails批量读取优化
到目前为止,我发现的所有建议都是针对优化批次编写操作。
许多表格都有成千上万的数据(如果不是数百万条记录的话),并且简单的解决方案domain.list().each { ... }
似乎一次将整个数据集加载到内存中。
使用休眠ScrollableResults似乎是一个很好的解决方案,但它的工作原理在RecordSet级别,并且不会重新创建实际的域对象。我可以使用id
字段到read()
实例,但这似乎效率低下。
Searchable插件似乎执行有效的reindex
操作。
还有哪些其他选项或优化可以成功批量读取域实例?
UPDATE
我最近碰到一个4岁的线程跌跌撞撞Grails的邮件列表上有answer从@BurtBeckwith那建议使用ScrollableResultSet是低效的。他建议使用标准GORM方法对记录进行分页,并分批清除会话。
我认为你有一个ScrollableResults查询所有实例ID的正确的想法,然后单独加载它们。唯一的问题是具有复合主键的遗留表。 – jamesallman 2012-01-09 20:04:07
根据您的数据库实现,使用偏移量可能会增加大量的开销,因为您反复选择相同的数据。这对于简单的查询可能不是问题,但可以为更复杂的查询添加大量时间。 – Joseph 2014-02-26 14:27:31