Как оптимизировать этот запрос Nhibernate (835 мс) - PullRequest
2 голосов
/ 04 октября 2010

У меня есть этот запрос

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

От NHibernate Profiler
Длительность запроса
-Только база данных: 7ms
-Всего: 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 ряд.Все, что я использую это для заполнения раскрывающегося списка.

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

Ответы [ 3 ]

2 голосов
/ 05 октября 2010

Хорошо, если вы настаиваете на 7 КБ (я ДЕЙСТВИТЕЛЬНО считаю, что вам следует прекратить переосмысливать свой дизайн ... но ...), вы можете попробовать выполнить запрос HQL, чтобы просто выбрать поля, которые вынужно от объекта, вместо того, чтобы запрашивать сами объекты.

С помощью написанного вами запроса nHibernate загружает данные из базы данных, что происходит довольно быстро, как вы заметили.Но ТОГДА на основе написанного вами запроса Linq он инициализирует, заполняет и возвращает объекты 7k Circuit.что, вероятно, занимает некоторое время ...

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

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

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

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

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

1 голос
/ 05 октября 2010

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

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

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

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

//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, и он дает вам предложения на лету его реализация автозаполнения

1 голос
/ 04 октября 2010

Подождите ... вы помещаете почти 7 тыс. Элементов в выпадающий список?Я правильно понимаю?

Если это так, можно ли использовать зависимые раскрывающиеся списки с ajax или похожим дизайном?

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

...