【发布时间】:2012-09-09 18:54:19
【问题描述】:
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查询的样子,观察日志
【问题讨论】:
-
能否请您发布 HQL 本身?您的原始查询是否包含集合连接?映射本身也很有用。
-
你能提供这两个查询的解释计划吗?
-
@ctapobep pastebin.com/qjzu5HKc 是 HQL 。如您所见,没有连接。
-
@JensSchauder 用于没有连接和 where 子句的查询,解释计划:static.inky.ws/image/2857/image.jpg 用于在 DUAL 上连接的查询,解释计划:static.inky.ws/image/2858/image.jpg 用于没有连接但 where 子句的查询,解释计划: static.inky.ws/image/2859/image.jpg
-
最后一个是no join and no where 子句,对不起。