locked
Linq to SQL, заполнение LongListSelector большим количеством записей RRS feed

  • Вопрос

  • Всем добрый день!

    Есть БД SQL CE, в ней таблица с 8к записями. Стурктура простая: id, parent_id, title. Нужно вывести все записи в LongListSelector, сгруппировав по алфавиту.

    Возникает проблема с производительностью запроса с группировкой по title[0]. Запрос выполняется порядка 30 секунд. Сам запрос такой структуры (взят с windowsphonegeek, у меня в проекте записан в операторном виде, к сожалению под рукой нет, но суть такая же)

    var cityByCountry = from city in source
                           group city by city.title[0] into c
                           orderby c.Key
                           select new Group<City>(c.Key, c);
     
    this.citiesListGropus.ItemsSource = cityByCountry;

    Если взять, например первые 100 (.Take(100)), то заполняется за пару секунд. Пробовал запросы без группировки, простой селект всех записей, выполняется довольно быстро, 2-3 секунды, т.е. проблемма в группировки. Думаю, еще тормозит выполнение группировка по первому символу title[0]. 

    Может быть есть какие то способы оптимизации запроса и вывода результата на экран?

    26 сентября 2012 г. 5:28

Ответы

  • Добрый день.

    Попробуйте выполнить аналогичный запрос в базе данных, скорее всего он тоже будет работать очень медленно...

    Попробуйте выбрать данные на клиента и группировать их уже в памяти.

    • Помечено в качестве ответа Alexey Arefiev 26 сентября 2012 г. 14:39
    26 сентября 2012 г. 7:01
    Отвечающий

Все ответы

  • Добрый день.

    Попробуйте выполнить аналогичный запрос в базе данных, скорее всего он тоже будет работать очень медленно...

    Попробуйте выбрать данные на клиента и группировать их уже в памяти.

    • Помечено в качестве ответа Alexey Arefiev 26 сентября 2012 г. 14:39
    26 сентября 2012 г. 7:01
    Отвечающий
  • Попробуйте проиндексировать базу, т.е. задайте Title в качестве индекса.
    26 сентября 2012 г. 8:01
  • Попробуйте проиндексировать базу, т.е. задайте Title в качестве индекса.

    Скорее всего не поможет, т.к. идет SubString... Но попробовать можно.
    26 сентября 2012 г. 8:20
    Отвечающий
  • Попробуйте выбрать данные на клиента и группировать их уже в памяти.

     Спасибо! С 30 секунд время выполнение уменьшилось до 2 секунд, не ожидал такого прироста) Если вдруг кому понадобится реализация ниже

    var listMyEnities = db.MyTable.ToList();
    list.ItemsSource = listMyEnities .GroupBy(s => s.Title[0]).OrderBy(s => s.Key).Select(s => new Group<MyEnity>(s.Key, s)).ToList();


    26 сентября 2012 г. 14:38
  • Странно. Значит у Вас первый запрос был записан не так. Группировка всех записей на сервере и получение, особенно с индексными столбцами, происходит намного быстрей, т.к. данных приходит меньше, они не дублируются. Если записать запрос правильно, т.е. групировать их на сервере, то запрос будет работать ещё быстрей. А какая ORM у Вас используется в данном случае?
    26 сентября 2012 г. 14:50
  • Добрый день. 

    Может дело в том что используется SQL CE, файл .sdf помещен в IsolatedStorage, поэтому запрос выполняется дольше? В изначальном варианте запрос выглядел так:

    list.ItemsSource = db.MyTable.GroupBy(s => s.Title[0]).OrderBy(s => s.Key).Select(s => new Group<MyEnity>(s.Key, s)).ToList();

    Использую Linq2Sql.

    27 сентября 2012 г. 6:04
  • Возможно вы столкнулись с проблемой N+1 выборок с своем запросе, вот здесь человек разбирает подобную проблему с Group By и приходит с решению, тому же что пришли и вы - Performance of Group By

    Для связи [mail]

    27 сентября 2012 г. 7:16