Медлительность SQL в ADO Entity Framework - PullRequest
3 голосов
/ 25 ноября 2010

Мне нужно создать файл csv, который будет содержать всех текущих подписчиков, а также ряд строк, поступивших из базы данных.

, чтобы выбрать всех подписчиков, которых я делаю:

public IQueryble<Subscribers> ListAllSubscribersByCalendarId(Decimal cid)
{
    return db.Subscribers.Where(x => x.calendar_id.Equals(cid));
}

довольно просто.

проблема в том, что у меня уже есть более чем 5000 , и это занимает вечно (буквально)!

даже дляпоказать только последние 30 записей, занимает много времени, мой запрос:

public IQueryble<Subscribers> ListLast30SubscribersByCalendarId(Decimal cid)
{
    return db.Subscribers
               .Where(x => x.calendar_id.Equals(cid))
               .Take(30)
               .OrderByDescending(x => x.created_date);
}

Что я могу сделать, чтобы ускорить этот процесс?

Ответы [ 4 ]

3 голосов
/ 25 ноября 2010

Ваше выражение должно быть проверено на клиенте и не может быть преобразовано в оператор SQL.Поэтому, если вы запустите SQL profiler , держу пари, вы увидите записи, поступающие по очереди к клиенту.

Измените условие на x.calendar_id == cid

1 голос
/ 25 ноября 2010

два возможных варианта:

создать некластеризованный индекс для x.calendar_id:

или сделайте заказ в приложении вместо sql:

public IQueryble<Subscribers> ListLast30SubscribersByCalendarId(Decimal cid)
{
    return db.Subscribers
               .Where(x => x.calendar_id.Equals(cid))
               .Take(30)
}

var ordered =  ListLast30SubscribersByCalendarId(1).ToList().OrderByDescending(x => x.created_date);
1 голос
/ 25 ноября 2010

Ответ Алиостада должен сильно помочь. Также убедитесь, что поле calendar_id проиндексировано правильно.

Во-первых, я просто проверяю, хотите ли вы взять первые 30, однако база данных определяет, какие первые 30 являются, и затем сортируют эти 30 по дате создания? Если вы хотите получить первые 30 на основе даты их создания, то вам нужно соответствующим образом включить created_date в свой индекс, чтобы его можно было использовать в запросе.

Наконец, этот ответ предполагает, что вы используете инструмент, который правильно отображает эти операторы LINQ в соответствующий запрос SQL, а не просто выполняет всю эту операцию над всем набором записей в памяти.

0 голосов
/ 25 ноября 2010

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

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