Быстрый JPA-запрос, но медленное сопоставление с сущностью - PullRequest
0 голосов
/ 05 октября 2018

Из-за проблем с производительностью при извлечении около 30 тыс. Результатов из БД в виде сущностей при использовании Hibernate JPA я вместо этого попытался написать namedQuery, чтобы лучше контролировать запрос и его время выполнения.В итоге я получаю почти 20 секунд только для тех немногих объектов, и эти 20 секунд необходимы для «старого» запроса и моего собственного namedQuery (который не займет ни секунды, чтобы получить результат при выполнении в клиенте SQL)так что в основном не имеет значения, использую ли я namedQuery или сгенерированный в спящем режиме запрос.

Можно ли предположить, что 98% времени используется для сопоставления этих результатов с соответствующими объектами?И если так, как я должен ускорить это?Ниже приведен запрос, который я написал сам (обратите внимание, что я явно должен указать все столбцы в SELECT)

SELECT exp.ID
  ,exp.CREATEDBY
  ,exp.CREATEDTIME
  ,exp.DELETED
  ,exp.LASTCHANGE
  ,exp.LASTCHANGEBY
  ,exp.STATUS
  ,exp.BRIXFIGURE
  ,exp.GRAMMAGE
  ,exp.INDIVIDUALPACKAGING
  ,exp.MINORDERQUANTITY
  ,exp.PACKAGINGHEIGHT
  ,exp.PACKAGINGLENGTH
  ,exp.PACKAGINGWIDTH
  ,exp.PALETTESIZE
  ,exp.QUANTITY
  ,exp.UNIT
  ,exp.VALIDUNTIL
  ,exp.EXPORTELEMENT_START
  ,exp.EXPORTSTATUS
  ,exp.webServiceResponse
  ,exp.CATEGORYID
  ,exp.COMMENTID
  ,exp.SUPPLIERID
  ,exp.TRANSPORTPACKAGINGID
  ,exp.LocationId
  ,exp.PriceRowId
  ,exp.EXPORTELEMENT_ENDDATE
  ,exp.BASEPRICE
  ,exp.BASEUNIT
  ,exp.BARCODES
  ,exp.EXPIRYDATE
  ,exp.PREORDERPERIOD
  ,exp.EXPORTWEEKID
  ,exp.EXPORT_TENDER_UID
  ,exp.EXPORT_UID
  ,exp.CURRENCY_ID
  ,exp.WEIGHT_PER_BOX
  FROM EXPORTELEMENT AS exp
  JOIN EXPORTELEMENT_LOCATION as exlo ON exlo.EXPORTELEMENTID = exp.ID
  WHERE exlo.LOCATIONID = :locationId
  AND exp.EXPORTELEMENT_ENDDATE <= :endDate
  AND exp.EXPORTELEMENT_START >= :startDate
  AND exp.DELETED = :deleted

1 Ответ

0 голосов
/ 11 октября 2018

Написание raw sql и использование hibernate / jpa для вас не улучшают производительность.Причиной может быть то, что ваш объект сопоставлен с другими объектами (выбирает, в отличие от ленивых), которые сопоставляются с другими объектами и т. Д. Таким образом, вы потенциально можете тянуть всю свою базу данных.Вы можете подумать, что выполняется только ваш запрос, но реальность такова, что другие сопоставления могут создавать / выполнять больше запросов sql ... В моем случае для 10000 строк сопоставление заняло 100 миллисекунд, но позволить hibernate / jpa выполнитькартографирование заняло 10 секунд, в целом 100x.

Что повышает производительность, так это выполнение картографирования самостоятельно.Примерно так:

@Query(nativeQuery = true, value = "your_raw_sql_here")
List<Object[]> yourNativeQueryMethod();

Тогда вы можете сопоставить объект самостоятельно:

for( Object[] objectArray: results) {
    BigInteger id = (BigInteger) objectArray[0];
    //etc...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...