2012-02-21 118 views
1

我正在寻找一种策略来批量处理所有查询(使用IN子句)以克服IN子句(See here)上数据库的限制。JPA 2.0:使用IN子句批量查询

我通常会得到大小为100000到305000的列表。所以,这对于解决这个问题变得非常重要。

到目前为止,我已经尝试了两种策略。

策略1:

  • 创建一个实体,并且因此与一个列中的表来保存这样的值(能与JPA动态创建的临时表2.0与供应商无关?),并使用在最终清理临时表之前,将临时表中的数据作为子查询添加到原始查询中。

  • 优点:非常高效的查询。真的很快,我必须承认我提到的数字,大部分时间都在一分钟之内。

  • 可能的缺点:使用临时表,这对我而言实际上是永久性的。

策略2:

  • 计算批量大小为给定的输入列表和每个批次执行查询,并累积的结果。

  • 优点:没有临时表。易于在同一事务中的任何线程。

  • 缺点:一个很大的缺点是执行所有批处理所花费的时间。对于上述数字,目前这个数字处于不可接受的水平。需要5至15分钟之间的任何东西!

我很感谢来自JPA大师的任何反馈,建议或改进。

谢谢。

回答

1

我只测试多达50,000个整数,但我身边有使用各种方法,使用CLR将大型列出了一些相当不错的性能数据和数字表领导包在较高端:

http://sqlblog.com/blogs/aaron_bertrand/archive/2010/07/07/splitting-a-list-of-integers-another-roundup.aspx

不确定您是否使用整数或字符串,但结果应该大致相同。另外,我会承认我不知道JPA 2.0是什么,但我认为你可以控制它发送到SQL Server的列表的格式。

+0

非常感谢张贴亚伦。你的解决方案看起来不错我需要将纯SQL的东西翻译成它的JPA等价物:) – JProgrammer 2012-02-21 21:26:39