我正在搜索我的一张桌子(遗留数据库)并在这里收到一段可怕的时间。该查询是由hibernate的标准api构建的,例如:
Criteria crit = getSessionFactory().getCurrentSession().createCriteria(P1.class);
crit.add(Restrictions.sqlRestriction("{alias}.compno like ?", "%" + s + "%", new StringType()));
crit.setMaxResults(25);
crit.setFirstResult(0);
crit.addOrder(Order.asc("compno"));
crit.list();
正如您所看到的,我已经在这里进行分页以提高性能。此标准平均需要~6 seconds
。
原生查询看起来像这样
select * from SCHEM.P1 where compno like '%100%' order by compno fetch first 25 rows only
仅采用10 ms
,这是一个巨大的差异imo。为什么标准运行得如此之慢?我需要切换回本机sql查询吗?
评论的好点:
是的,我在范围上没有一些关系:
<set name="pI" table="P12" lazy="false">
<key column="awcompno" update="false" />
<one-to-many class="org.gee.hibernate.P12" not-found="ignore"/>
</set>
<one-to-one name="info" class="org.gee.hibernate.P13" />
<set name="ma" table="P03" lazy="true" schema="SCHEMP" mutable="false" >
<key column="macountry" property-ref="land" update="false" />
<one-to-many class="org.gee.hibernate.P03" not-found="ignore" />
</set>
<set name="users" table="P15" lazy="true">
<key column="apcompno" update="false" />
<one-to-many class="org.gee.hibernate.P15" not-found="ignore"/>
</set>
答案 0 :(得分:3)
我的提示是:
<set name="pI" table="P12" lazy="false">
<key column="awcompno" update="false" />
<one-to-many class="org.gee.hibernate.P12" not-found="ignore"/>
</set>
这个系列不是懒惰的。这可能是你的瓶颈。
您需要所有信息吗?如果您只想阅读ID,可以使用hibernate读取实体的字段。
答案 1 :(得分:1)
IBM pureQuery有一些非常好的工具可用于加速与DB2一起使用的Hibernate应用程序。另一个好处是...它使调试变得更加容易,因为它允许您关联SQL和Java代码。
答案 2 :(得分:0)
我想看看数据库日志,看看执行的确切SQL指令是什么。 Hibernate可能加载的不仅仅是你期望的本机查询,因为它可能会加载渴望的集合等。
所以 - 启用Hibernate查询日志记录,或者更好的是,检查数据库日志以查看执行的内容。