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的查询在查看日志时的样子
答案 0 :(得分:0)
我没有得到与您的查询完全匹配的解释计划,但似乎oracle使用不同的索引进行两次查询。
您可以创建包含columnA
和columnL
的索引吗?
如果您的索引只包含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
产生预期的结果?