我通过几百万条记录INA数据库书面方式,其需要定期(每星期例如)应用程序循环,并在每一行上的结果执行代码。

由于该表是如此之大,我怀疑当我打电话SomeObject.FindAll()则读取所有1.4million行,并试图在返回所有行的SomeObject []。

是否有一种方法可以执行一个SomeObject.FindAll()的表达,但在一个更加DBMS友好的方式加载的值?

有帮助吗?

解决方案

不与FindAll() - 这,因为你已经猜到,会尝试一次加载指定类型的所有实例(和,这取决于你如何得到NHibernate的设置可发出SQL查询的惊人数字做到这一点)。

延迟加载仅适用于对象的属性,因此,例如,如果你有一个持久型SomeObjectContainer其中有一个特性以这样一种方式,它应该匹配所有SomeObjects与SomeObject映射lazy="true"的列表,然后做了一个foreach在该列表属性,你会得到你想要的排序是什么;默认情况下,NHibernate的会发出列表中的每个要素的查询,只有一次一个加载。当然,读取缓存将增长极大的相,所以你可能需要刷新了不少。

你可以做的是一个问题HQL(甚至嵌入式SQL)查询过的ID一次一个的读取与的findByPrimaryKey相关目标检索所有SomeObjects所有的ID,然后循环。再次,这不是特别优雅。

说实话,在这样的情况我可能会变成一个定期维护工作中一个存储过程 - 除非你真的要运行的代码的对象上,而不是操纵数据不知何故。这可能惹恼对象纯粹主义者,但有时一个存储过程是正确的道路要走,尤其是在这样的批处理作业场景。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top