JPA(在我的特定情况下为 eclipselink)在使用 query.setFirstResult()/query.setMaxResults()
的情况下生成 /*+ FIRST_ROWS */
:
SELECT * FROM (
SELECT /*+ FIRST_ROWS */ a.*, ROWNUM rnum FROM (
SELECT * FROM TABLES INCLUDING JOINS, ORDERING, etc.) a
WHERE ROWNUM <= 10 )
WHERE rnum > 0;
这迫使 Oracle 使用嵌套循环而不是散列连接。一般来说,这是有降神会的,但在我的特殊情况下,它会大大降低性能。
是否可以禁用特定查询的提示使用/生成?
最佳答案
正如 @ibre5041 所说,FIRST_ROWS 提示已被弃用,在 Oracle 上下文中,应使用 FIRST_ROWS(N) 代替它。在我的例子中,实际上不需要 FIRST_ROW 和 FIRST_ROW(N),因此为了告诉 eclipselink 不要使用过时的东西,可以在 persistence.xml 中指定 oracle 版本:
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.Oracle11Platform" />
添加此后,我收到了奇怪的错误: Could not initialize class org.eclipse.persistence.platform.database.oracle.Oracle11Platform 但是,当我将 ojdbcN.jar 放入 domain/lib/ext 后,错误就消失了。
因此,eclipselink 生成没有 FIRST_ROW 提示的查询,并且 Oracle 使用更好的计划。
关于java - 是否可以禁用每个特定查询的 jpa 提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840776/