我正在使用以下方法查询大于时间戳的类的所有修订:
AuditReaderFactory
.get(emf.createEntityManager())
.createQuery().forRevisionsOfEntity(clazz, false, true)
.add(AuditEntity.revisionProperty("timestamp").gt(existingIndex.lastModified()))
.getResultList();
这是@ManyToOne
使用查询重新创建一个引用的对象:
select <audit cols for this type>
from <audit table>
where DTYPE IN (<class type>)
and REV=(
SELECT max(REV)
FROM <audit table>
where TYPE IN (<class type>)
and REV <= <maximum revision in revision entity table>
and <subquery>.id=<query>.id
)
and REVTYPE<>2
AND <audit table>.id=<id of entity being restored>
这个查询非常慢,仅针对一个实体就需要 100 多分钟(事实上,在我写这篇文章的时候它还在继续)。为什么它会获得实体的最新版本(减去 DEL 版本)?ORDER BY REV LIMIT 1
使用 a (或类似的数据库没有)要快得多LIMIT
。我几乎只想直接使用 SQL,因为这太慢了。它也可以通过直接在子查询中使用 id 而不是引用查询的表 id 来加速。我在DTYPE
,REV
和REVTYPE
, 上有索引,在 id 上有一个唯一键,REV
所以这不是索引问题。
我不确定它为什么要使用上述查询来重新创建引用的对象,并希望有任何见解。这是在奔腾 4 机器上的 MySQL 5.1 数据库上,但在双核机器上也需要相当长的时间。