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

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

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

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

有什么我可以做的,使用休眠?

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

4

2 回答 2

0

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

你能创建一个包含columnAand的索引columnL吗?

如果您有一个仅包含 的索引columnA,您可能可以删除它而不会对其他查询的性能产生很大影响。

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

于 2012-09-18T04:33:58.983 回答
-2

这意味着您正在使用hibernate/jpa?如果是这样,我猜您正在使用EntityManager.createNativeQuery()来创建查询?尝试删除您的 where-restriction 并改用.setMaxResults(25)on Query

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

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

产生预期的结果?

于 2012-09-17T14:22:22.120 回答