2

У меня есть этот запрос,Как оптимизировать этот запрос NHibernate (835ms)

var temp = from x in ActiveRecordLinq.AsQueryable<Circuits>() 
         where x.User_Created == false 
         orderby x.Description 
         select x; 

Из NHibernate Profiler
длительность запроса
-Database только: 7мс
-Total: 835ms

Запрос СГЕНЕРИРОВАННЫМИ :

SELECT this_.Circuit_ID  as Circuit1_35_0_, 
    this_.[Description] as column2_35_0_, 
     this_.[User_Created] as column3_35_0_ 
FROM  dbo.Circuit this_ 
WHERE this_.[User_Created] = 0 /* @p0 */ 
ORDER BY this_.[Description] asc 

Похоже, что это довольно простой запрос. Он возвращает 6821 строк. Все, что я использую для этого, это заполнить выпадающий список.

Заранее спасибо

+2

Там нет ничего, что вы можете оптимизировать там. Извлечение почти 7 тыс. Строк и их отображение в раскрывающемся списке - это просто плохая конструкция. –

+0

Единственное, что вы можете оптимизировать, это количество элементов в этом выпадающем списке :). Можете ли вы сделать что-то вроде автозаполнения? – sirrocco

+0

@Diego, я просто обновляю текущий дизайн (переключение с sql). Пользователь должен иметь возможность выбирать схему, и только сейчас их 7k. Как бы вы это сделали? – Gage

ответ

2

Ok, если вы настаиваете на 7k (I REALLY полагаете, что вам стоит остановиться, чтобы переосмыслить ваш дизайн ... но ...), вы можете попробовать выполнить запрос HQL, чтобы просто выбрать поля, которые вам нужны от объекта, вместо запроса на сами объекты.

С запросом, который вы написали, nHibernate загружает данные из базы данных, которые происходят довольно быстро, как вы заметили. Но THEN, основанный на запросе Linq, который вы написали, инициализирует, заполняет и возвращает объекты 7k Circuit. который, вероятно, занимает некоторое время ...

И поскольку вы фактически не используете «объект» каким-либо значимым образом в этом случае (просто пара слов и значений для выпадающего списка), вам действительно не нужно nHibernate для создания объектов.

Попробуйте изменить код, чтобы просто вернуть пару текста/значения с помощью HQL или LinqToNHibernate.

HQL будет выглядеть примерно так:

select c.description, c.id from Circuit c 
where c.ordercreated = false 
orderby c.description 

Я знаю, что вы можете сделать это с LinqToNhibernate, а я просто не имеют каких-либо простых примеров под рукой.

+0

Вот что я в итоге пытался. Когда я выбрал x.Description вместо x, он сократил время пополам. Поскольку это происходит только при запуске, я собираюсь оставить его, поскольку, как только пользователь открывает программу, они, как правило, оставляют ее открытой. – Gage

1

Wait ... вы ставите почти 7k элементы в списке? Правильно ли я понимаю это?

Если да, можно ли использовать зависимые выпадающие списки с помощью ajax или какого-либо подобного дизайна?

Если это в Интернете, вы, вероятно, глядя на относительно большой страницы, которая должна быть передана вниз на клиентский компьютер, так что оптимизация запроса NH может быть преждевременной оптимизацией ...

+0

Да 7k элементов в выпадающем списке lol. Его приложение C# работает от общего сетевого ресурса. – Gage

1

7k записей в раскрывающемся списке плохо для пользователя. Поскольку вы уже заказываете описание, я предполагаю, что ваши пользователи уже знают (хотя бы частично) то, что они хотят выбрать. Поэтому предоставление полного списка фактически препятствует пользователю.

Поскольку вы спрашиваете, что такое autocompleter является

представить себе поле ввода, где пользователь вводит ряд символов. Когда пользователь вводит то, что хочет, запрос будет срабатывать. Этот строковый параметр будет использоваться для дальнейшего ограничения размера результирующего набора.

поэтому ваша реализация запроса что-то вроде этого псевдокода:

//passedParameter => "%foo%" 
var temp = from x in ActiveRecordLinq.AsQueryable<Circuits>() 
       where x.User_Created == false 
       and x.Description like passedParameter 
       orderby x.Description 
       select x; 

Фактическая реализация как на запрос, а также, если вы решили реализовать «% Foo%» или «Foo%» и т.д., это ваше решение ,

Пользовательский интерфейс будет сведен к записи «foo» в поле ввода, и результаты будут отображать только соответствующий Circuits, на котором пользователь выберет то, что он хочет. Если результирующий набор все еще слишком велик, пользователь может добавить «b» к уже набранному «foo», создав «foob», где снова снова возникает запрос, возвращающий еще более ограниченный набор результатов.

Когда вы набираете в Google, и это дает вам предложения на лету сво autocompleter реализации

+0

Вот что я понял, единственная проблема заключается в том, что пользователь должен иметь возможность вводить туда собственное имя схемы (одна из причин, по которой список настолько велик). Да, я бы разработал его по-другому, но это еще не все. – Gage

 Смежные вопросы

  • Нет связанных вопросов^_^