hibernate oracle rownum问题

时间:2012-09-17 14:18:56

标签: oracle hibernate

SELECT * FROM ( 
   select * 
   from tableA 
   where ColumnA = 'randomText' 
   ORDER BY columnL ASC 
) WHERE ROWNUM <= 25

执行此查询时,由于某些Oracle优化,查询大约需要14分钟才能执行。如果我删除where子句,查询将在几秒钟内执行。表中的大多数列都有索引,包括上面提到的那些。我使用hibernate时对查询结构没有太大的灵活性。

此查询也会立即返回结果,结果正确:

SELECT * 
FROM ( 
   select * 
   from tableA, 
        dual 
   where ColumnA = 'randomText' 
   ORDER BY columnL ASC
) WHERE ROWNUM <= 25

我可以做些什么,使用hibernate?

更新:我使用EntityManager.createQuery(),我也使用setMaxResults(25)和setFirstResult()。上面的查询是hibernate的查询在查看日志时的样子

2 个答案:

答案 0 :(得分:0)

我没有得到与您的查询完全匹配的解释计划,但似乎oracle使用不同的索引进行两次查询。

您可以创建包含columnAcolumnL的索引吗?

如果您的索引只包含columnA,那么您可以删除它而不会对其他查询的效果产生太大影响。

另一种方法是添加提示以使用更快查询中使用的索引。但这需要您使用本机sql。

答案 1 :(得分:-1)

这意味着你正在使用hibernate / jpa?如果是这样,我猜您使用EntityManager.createNativeQuery()来创建查询?请尝试删除where限制,然后使用.setMaxResults(25)上的Query代替。

无论如何,你为什么需要外选?不会

select * 
from tableA 
where ColumnA = 'randomText' 
AND ROWNUM <= 25
ORDER BY columnL ASC 

产生预期的结果?