Я использую LINQ to NH, чтобы получить кучу данных при запуске приложения. Я специально добавил ToList()
, чтобы принудительно выполнить немедленное выполнение запроса:
Group group = GetGroup();
Log.Info("started");
var list = Session.Linq<Data>()
.Where(p => p.Group.Id == group.Id)
.OrderByDescending(p => p.Stamp.Counter) /* Stamp is composite mapping */
.Select(p => new
{
Counter = p.Stamp.Counter,
Status = p.Status,
})
.Take(4000)
.ToList();
Log.Info("done");
Проверка журнала DEBUG для NHibernate.SQL
logger дает следующий SQL, как и ожидалось (и этот же запрос появляется в SQL Profiler, когда я запускаю мониторинг):
SELECT top 4000 this_.Counter as y0_, this_.Status as y1_
FROM [Data] this_
LEFT OUTER JOIN [Group] group1_ ON this_.Group_id=group1_.Id
WHERE group1_.Id = @p0
ORDER BY this_.Counter desc; @p0 = 1
Проблема заключается в том, что этот запрос занимает 2 минуты для завершения при вызове из моего приложения по сравнению с 0,5 с при выполнении в SSMS! Фактически, пока приложение ожидает завершения запроса, я могу выполнить его в SSMS и получить результаты мгновенно.
Как вы думаете, откуда эта разница?