У меня есть этот запрос t-sql из старой системы, которая работает на Cold Fusion. Этот запрос занимает менее одной секунды, чтобы вернуть записи.Медленная производительность в запросе LINQ
select dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'}) p, count(*) c
from account
where createdAt <= {ts '2015-02-28 23:59:59'}
and accountType = 'business'
and dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'}) <12
group by dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'})
order by dateDiff(month, dateAdd(hour, 11, createdAt), {ts '2015-02-28 23:59:59'})
Я теперь преобразовываю это в новую систему с использованием .NET и LINQ. Мне удалось написать этот запрос LINQ, который дает мне те же результаты.
from a in db.Accounts
where SqlFunctions.DateDiff("Month", SqlFunctions.DateAdd("Hour", 11, a.createdAt), "2015-02-28 23:59:59") < 12
&& a.accountType == "business"
group a by SqlFunctions.DateDiff("Month", a.createdAt, "2015-02-28 23:59:59") into grp
orderby SqlFunctions.DateDiff("Month", grp.FirstOrDefault().createdAt, "2015-02-28 23:59:59")
select new ProgressViewModel.Data
{
date = SqlFunctions.DateDiff("Month", grp.FirstOrDefault().createdAt, "2015-02-28 23:59:59"),
amount = grp.Count()
});
Тем не менее, этот запрос занимает не менее 5 секунд, чтобы работать, в то время как с первым (T-SQL) она занимает менее 1 секунды.
Используя Glimpse, мы можем увидеть t-sql, который генерирует запрос LINQ. Он имеет несколько подвыборок, и он в 5 раз длиннее быстрого запроса.
Как я могу улучшить запрос LINQ?
есть ли шанс включения выше запроса к хранимой процедуре и возвращает результат и отображать в сетке? если да, то это более эффективный способ – Immu
'grp.FirstOrDefauilt()' выглядит подозрительно для одного - разве вы не имели в виду 'grp.Key'? Кроме того, почему не 'dateAdd' передаваемый параметр, а не значение в базе данных? Это должно позволить вам использовать индекс на 'createdAt', если он есть. – Luaan
Не могли бы вы сообщить нам, как выглядит сгенерированный запрос LINQ? – JunaidKirkire