Hibernate,DB2 - 运行缓慢的查询

时间:2010-12-07 10:55:05

标签: java sql hibernate db2

我正在搜索我的一张桌子(遗留数据库)并在这里收到一段可怕的时间。该查询是由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>

3 个答案:

答案 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代码。

看一下这篇文章http://www.ibm.com/developerworks/data/library/techarticle/dm-1008hibernateibatispurequery1/index.html

答案 2 :(得分:0)

我想看看数据库日志,看看执行的确切SQL指令是什么。 Hibernate可能加载的不仅仅是你期望的本机查询,因为它可能会加载渴望的集合等。

所以 - 启用Hibernate查询日志记录,或者更好的是,检查数据库日志以查看执行的内容。