Я использую nhibernate как ORM.И один из моих выборов невероятно медленный.Дело в том, что генерация sql занимает много времени.Я уверен, что это не сам SQL-запрос, который медленный, потому что я рассчитал сам запрос с помощью SQL-профилировщика.И это показало, что между началом выполнения кода nhibernate и запросом, отправляемым в базу данных, есть промежуток ~ 15 секунд.Сам сгенерированный SQL-запрос выполняется так же быстро, как и ожидалось.
Код выбора (в репозитории) выглядит следующим образом
public IEnumerable<Document> GetAllDocumentsReadyForDeletion()
{
return from doc in _session.Query<Document>()
where doc.StorageType == 'D'
select doc;
}
Я также пытался:
return _session.CreateCriteria<Document>()
.Add(Restrictions.Eq("StorageType", 'D'))
.List<Document>();
что эквивалентно (верно?).Тем не менее, они оба работают примерно одинаково (медленно, примерно 15 секунд для генерации SQL-запроса)
Это, однако, работает так быстро, как я хочу, и я понятия не имею, почему:
return _session.CreateQuery(
"from Document doc where doc.StorageType = 'D'")
.List<Document>();
Я действительно хочу использовать версию linq to nhibernate.Есть идеи, почему код работает по-другому?(Если вам нужно больше деталей, просто спросите!)
Edit1
О, боже, я сделал глупую ошибку или что-то другое? Я ошибочно прочитал неправильный столбец вsql profiler .. ЭМ, фактическое время выполнения для первых двух ~ 18 секунд, для третьего ~ 0 сек.Я пытаюсь найти различия в sql atm ...
Edit2
Это на самом деле становится совершенно другим вопросом.Получающиеся запросы почти точно такие же, за исключением того, что первые два заключены в "exec sp_executesql"
Теперь я немного проследил это с помощью анализатора запросов, и медленный запрос имеет один шаг:
clustered index scan.
Быстрый запрос состоит из двух шагов:
Index seek
Bookmark lookup
Есть ли у вас что-нибудь подобное?