Использование LINQ to SQL для запроса большой таблицы (10M + строк) приводит к тайм-ауту - PullRequest
2 голосов
/ 12 января 2011

Я вижу проблему тайм-аута, связанную с использованием LINQ to SQL для выполнения запроса.Поэтому я делаю простую консольную программу, и проблема все еще возникает, не всегда, но достаточно случайно, чтобы меня это беспокоило.Вот почти вся моя программа:

    public static TransactionDataContext DataContext = new TransactionDataContext();

    static void Main(string[] args)
    {
        int year = ...;
        int stateCode = ...;

        DateTime minYear = new DateTime(year, 01, 01);
        DateTime maxYear = new DateTime(year, 12, 31);

        var volumes = DataContext.TRANSACTIONs.Where(p =>
                p.STATE_NO == stateCode &&
                p.TRANS_DATE >= minYear &&
                p.TRANS_DATE <= maxYear).OrderBy(p => p.TRANS_DATE);

    }

В таблице TRANSACTION в моей базе данных содержится более 10 миллионов записей.С точкой останова, установленной на последней закрывающей фигурной скобке, я запускаю отладчик.Иногда, при расширении переменной volume и представлении результатов отображаются данные, а иногда появляется сообщение «Тайм-аут оценки функции».Увеличение времени ожидания путем установки DataContext.CommandTimeout, похоже, не помогает, и я не думаю, что это решение в любом случае.

У меня вопрос, почему у LINQ to SQL есть такого рода ограничения или я делаю что-то не так.

ОБНОВЛЕНИЕ: Выполнение оператора SQL из Management Studio в порядке, поэтому я не думаю, чтоэто проблема индекса.

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Я не думаю, что проблема в том, что у вас есть 10M записей, поскольку запрос еще не выполняется вообще (поскольку вы не вызывали ToList или ToArray).

Что требует времени, так это генерация сценария SQL.

Я думаю, что сначала удалите некоторые параметры вашего запроса, например, удалите OrderBy и задайте значение Where, где будет только p.STATE_NO == stateCode, и проверьте, что будет потом.

Затем, шаг за шагом добавьте некоторые параметры, и вы увидите, что вызывает проблему. Может даже случиться так, что такого рода сравнение дат не поддерживается, или, может быть, STATE_NO - это тип, отличный от stateCode, я не уверен, я просто думаю громко.

Это поможет вам разобраться с проблемой.

Вы также хотели бы проверить работу с Entity-SQL или программно (или даже жестко запрограммированным запросом) при формировании запроса (без linq), это поможет вам добраться проблема.

Еще одна мысль, которую вы хотели бы рассмотреть, - это использовать ToTraceString, чтобы увидеть, что EF генерирует для вашего linq.

Однако, если вышеперечисленное не помогло вам ни с чем, вам придется предоставить нам ваши данные об исключениях / трассировку стека, чтобы дать нам представление о том, что все это значит.

2 голосов
/ 12 января 2011

Возможно, это вопрос SQLServer больше, чем LINQ. Вам нужен индекс покрытия на TRANS_DATE и STATE_NO. Если у вас его нет, это объяснит проблему, и это не проблема LINQ.

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