У меня есть база данных с таблицей Customer. Каждый из этих клиентов имеет внешний ключ для таблицы , которая дополнительно имеет внешний ключ для Адрес таблица (таблица переименована для простоты).NHibernate: Иерархия объектов и производительность
В NHibernate Я пытаюсь запросить таблицу клиентов, как это:
ISession session = tx.Session;
var customers = session.QueryOver<Customer>().Where(x => x.Country == country);
var installations = customers.JoinQueryOver(x => x.Installation, JoinType.LeftOuterJoin);
var addresses = installations.JoinQueryOver(x => x.Address, JoinType.LeftOuterJoin);
if (installationType != null)
{
installations.Where(x => x.Type == installationType);
}
return customers.TransformUsing(new DistinctRootEntityResultTransformer()).List<Customer>();
Какие результаты в запросе SQL аналогично (перехваченных по NHibernate Profiler):
SELECT *
FROM Customer this_
left outer join Installation installati1_
on this_.InstallationId = installati1_.Id
left outer join Address address2_
on installati1_.AddressId = address2_.Id
WHERE this_.CountryId = 4
and installati1_.TypeId = 1
Когда я выполните вышеуказанный SQL-запрос в Microsoft SQL Server Management Studio выполняется за 5 секунд, но возвращает ~ 200 000 записей. Тем не менее требуется много времени, чтобы получить Список при запуске кода. Я ждал 10 минут без каких-либо результатов. Журнал debug-log показал, что из-за иерархии объектов создается и инициируется множество объектов. Есть ли способ исправить эту проблему производительности?
Здесь нет сохранения/обновления, только чтение данных с помощью запроса * SELECT *. Мне нужно запросить все данные, так как они должны использоваться для отчета компании. Есть ли способ использовать NHibernate для возврата необработанных данных (примитивных типов) вместо объектов? – dhrm
Не можете использовать службы отчетов или службы интеграции для получения данных из базы данных. Эти инструменты сделаны из таких отчетов. Или получить данные с поисковым вызовом. Таким образом, у вас будет больше контроля над количеством объектов в памяти. criteria.SetFirstResult (СНВ) .SetMaxResult (PAGESIZE); – Peter