Исключительно медленное время отклика базы данных на запрос Linq - PullRequest
1 голос
/ 17 января 2009

Я написал, как мне показалось, довольно солидное утверждение Linq, но это время ожидания выполнения от 2 до 5 секунд. У кого-нибудь есть мысли о том, как это ускорить?

            t.states = (from s in tmdb.tmZipCodes
                        where zips.Contains(s.ZipCode) && s.tmLicensing.Required.Equals(true)
                        group s by new Licensing { 
                            stateCode = s.tmLicensing.StateCode,
                            stateName = s.tmLicensing.StateName,
                            FIPSCode = s.tmLicensing.FIPSCode,
                            required = (bool)s.tmLicensing.Required,
                            requirements = s.tmLicensing.Requirements,
                            canWorkWhen = s.tmLicensing.CanWorkWhen,
                            appProccesingTime = (int) s.tmLicensing.AppProcessingTime 
                        }
                            into state
                            select state.Key).ToList();

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

Ответы [ 3 ]

2 голосов
/ 17 января 2009

Я не уверен, почему это занимает так много времени, но может помочь взглянуть на LINQPad , он покажет вам фактический сгенерированный запрос и поможет оптимизировать.

также, это может быть не фактический запрос, который занимает много времени, это может быть генерация запроса. Я обнаружил, что самая длинная часть - это когда linq преобразуется в оператор sql.

вы могли бы использовать скомпилированный запрос для ускорения процесса генерации sql. немного информации можно найти на 3devs . Я не пытаюсь рекламировать свою запись в блоге, но думаю, что она подходит.

1 голос
/ 17 января 2009

Вы, кажется, не используете группу, просто выбираете ключ в конце. Итак, это делает то же самое, что вы хотите?

t.states = (from s in tmdb.tmZipCodes
            where zips.Contains(s.ZipCode) && s.tmLicensing.Required.Equals(true)
            select new Licensing { 
                stateCode = s.tmLicensing.StateCode,
                stateName = s.tmLicensing.StateName,
                FIPSCode = s.tmLicensing.FIPSCode,
                required = (bool)s.tmLicensing.Required,
                requirements = s.tmLicensing.Requirements,
                canWorkWhen = s.tmLicensing.CanWorkWhen,
                appProccesingTime = (int) s.tmLicensing.AppProcessingTime 
            }).Distinct().ToList();

Также имейте в виду, что LINQ не выполняет запрос, пока не должен. Поэтому, если вы строите свой запрос в двух операторах, он не будет выполнять этот запрос в контексте данных (в данном случае SQL Server) до вызова ToList. Когда запрос выполняется, он объединит несколько запросов в один запрос и выполнит его.

1 голос
/ 17 января 2009

Я надеюсь, что это не имеет значения, но

s.tmLicensing.Required.Equals(true)

выглядит очень (мне) как:

s.tmLicensing

при условии, что это логическое свойство.

Учитывая, что вы знаете, что это правда, я не вижу особого смысла в том, чтобы иметь это в группе.

Сказав это, Джон Бокер абсолютно прав в обоих случаях: выясните, является ли это SQL или LINQ, а затем атакуйте соответствующий бит.

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