Hibernate, DB2 - Медленно выполняющиеся запросы - PullRequest
2 голосов
/ 07 декабря 2010

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

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 ]

3 голосов
/ 07 декабря 2010

Мой совет:

<set name="pI" table="P12" lazy="false">
    <key column="awcompno" update="false" />
    <one-to-many class="org.gee.hibernate.P12" not-found="ignore"/>
</set>

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

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

1 голос
/ 08 декабря 2010

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

Взгляните на эту статью http://www.ibm.com/developerworks/data/library/techarticle/dm-1008hibernateibatispurequery1/index.html

0 голосов
/ 07 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...