2010-12-07 4 views
2

Я выполняю поиск по одной из моих таблиц (устаревшая база данных) и получаю здесь ужасное время. Запрос строится на критерии апи из спящего режима и т.д .:Hibernate, DB2 - медленные запросы

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(); 

Как вы можете видеть, что я уже делаю подкачки здесь, чтобы улучшить Perfomance. Этот критерий требует в среднем ~6 seconds.

Ну родной запрос, который выглядит следующим образом

select * from SCHEM.P1 where compno like '%100%' order by compno fetch first 25 rows only 

принимает только 10 ms, который является огромной разницей им. Почему критерии работают так медленно? Нужно ли переключиться обратно на собственный 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

Вам нужно больше информации: Используете ли вы один-ко-многим/много-к-одному/многие-ко-многим в вашей организации? – 2010-12-07 10:58:18

+0

обновил мой вопрос. – onigunn 2010-12-07 11:08:00

ответ

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> 

Эта коллекция не лень. Это может быть вашим узким местом.

Нужна Вам вся информация? Вы можете читать поля своей сущности с помощью спящего режима, если вы хотите только прочитать идентификаторы.

+0

Да, вы здесь. Удаление этого отношения решает медленное время запроса. Спасибо, что намекнул мне таким образом! – onigunn 2010-12-07 12:06:14

0

Я бы сказал бы взглянуть на журналы БД, чтобы проверить, что это точные инструкции SQL, которые выполняются. Hibernate, возможно, загружает больше, чем обычный запрос, который вы ожидаете, так как он может загружать коллективные файлы и т. Д.

Так что включите ведение журнала запросов Hibernate или, еще лучше, проверьте журналы БД, чтобы увидеть, что будет выполнено.

1

IBM pureQuery имеет некоторые действительно прекрасные возможности для ускорения приложений Hibernate, работающих с DB2. Другое преимущество ... это облегчает отладку, поскольку позволяет сопоставить ваш SQL и ваш Java-код.

Посмотрите на эту статью http://www.ibm.com/developerworks/data/library/techarticle/dm-1008hibernateibatispurequery1/index.html