Я использую 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
дает следующий 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 и мгновенно получить результаты.
Как вы думаете, откуда эта разница?