Тайм-аут запроса Entity Framework, но SQL мгновенный

У меня есть пара выражений, для которых я запускаю Count() в EF6. Сгенерированный SQL-запрос оказывается несколько сложным, затрагивая несколько таблиц с несколькими переданными параметрами. Однако он выполняется менее чем за секунду, если я скопирую SQL в SSMS.

В EF Linq Query занимает более 30 секунд и часто просто выдает исключение Connection Timeout.

Глядя на монитор активности, я вижу, что один и тот же запрос выполняется много тысяч (если не миллионов) раз.

Кажется, сотни тысяч прочтений

Код, запускающий запросы, состоит из пары выражений, объединенных с помощью LinqKit AsExpandable() и Invoke().

//properties is an IQueryable<Property> and checkDate a DateTime
int propertyCount = FilterCompliantOnDate(properties, checkDate).Count();



public IQueryable<Property> FilterCompliantOnDate(IQueryable<Property> properties, DateTime checkDate)
{
    // SelectedComplianceCategory is a local property (int?)
    return properties.AsExpandable().Where(p=>PropertyIsCompliant.Invoke(p, checkDate, SelectedComplianceCategory));
}



public static readonly Expression<Func<Property, DateTime, int?, bool>> PropertyIsCompliant = (p, checkDate, complianceCategory) =>
    CategoryComplianceRatings.Invoke(p, complianceCategory, checkDate).Any() &&
    CategoryComplianceRatings.Invoke(p, complianceCategory, checkDate)
        .All(cr => cr.ComplianceRating == ComplianceRating.Compliant);



private static readonly Expression<Func<Property, int?, DateTime, IQueryable<PropertyComplianceRating>>> CategoryComplianceRatings =
    (p, categoryId, checkTime) => p.ComplianceRatings.AsQueryable()
    .Where(cr =>
        cr.ComplianceCategory != null &&
        (
            categoryId == null ||
            (categoryId != null && cr.ComplianceCategory.Id == categoryId)
        )
    )
    .GroupBy(cr => cr.ComplianceCategory)
    .Select(g => g
    .Where(cr => cr.Date < checkTime)
    .OrderByDescending(cr => cr.Date)
    .FirstOrDefault()
);

person Ben Ford    schedule 23.12.2014    source источник
comment
можешь показать свой код?   -  person faby    schedule 23.12.2014
comment
Это не цикл или что-то в этом роде. Приведенный выше пример кода вызывает огромный всплеск обработки и занимает более 30 секунд. Однако, если я сам извлекаю SQL, он работает за ‹1 с.   -  person Ben Ford    schedule 23.12.2014
comment
В вашей строке подключения есть что-то вроде MultipleActiveResultSets = true? Это необходимо при использовании отложенной загрузки, но также оказывает негативное влияние на замедление запросов. Если у вас установлено значение true, попробуйте установить для него значение false, чтобы увидеть, изменит ли это поведение этой части кода.   -  person Solomon Rutzky    schedule 13.01.2015
comment
Я использую MARS на данный момент. Я попробую отключить его и посмотреть, есть ли положительный эффект.   -  person Ben Ford    schedule 14.01.2015


Ответы (2)


Проверьте настройки сеанса (arithabort, ansi_nulls...) при выполнении из разных сред. Убедитесь, что они все одинаковые. Во многих случаях разные настройки приводят к тому, что одна и та же процедура выполняется с совершенно разной продолжительностью выполнения.

person Amir Pelled    schedule 23.12.2014