Вопрос производительности между двумя запросами Linq в LinqPad и на практике - PullRequest
2 голосов
/ 05 апреля 2011

У меня есть запрос:

(from sr in ctx.STARS_Route
                            where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
                            select sr.DistrictRouteNumber).Distinct();

В LinqPad запрос выполнялся примерно за 0,3 секунды.В таблице STARS_RouteStopDestination примерно 800 тыс. Записей, но в среднем возвращается около 30-90 записей.

На практике метод, возвращающий результаты этого запроса, занимал 4+ секунды!Это не имело никакого смысла.

Единственное, о чем я мог подумать, это то, что предложение .Any занимало много времени, но LinqPad сказал, что запрос был быстрым.Я настроил тест (пожалуйста, прости имена):

using (STARSEntities ctx = new STARSEntities())
        {
            var Original = (from sr in ctx.STARS_Route
                            where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
                            select sr.DistrictRouteNumber).Distinct();

            var Entity = (from rsd in ctx.STARS_RouteStopDestination
                          where rsd.STARS_DistrictRoute.DistrictId == districtId
                          && rsd.IsWorkingSet == true
                          select rsd.STARS_Route.DistrictRouteNumber).Distinct();

            DateTime startOriginal = DateTime.Now;
            routes = Original.ToList();
            Debug.WriteLine("Original took: " + (DateTime.Now - startOriginal).ToString());
            DateTime startEtity = DateTime.Now;
            routes = Entity.ToList();
            Debug.WriteLine("Entity took: " + (DateTime.Now - startEtity).ToString());
        }

Вывод поразил меня:Оригинал занял: 00: 00: 04.0270000Для объекта потребовалось: 00: 00: 00.0200000

Почему запрос с предложением .Any выполняется намного дольше и почему LinqPad говорит, что запрос Original выполняется немного быстрее, чем запрос Entity для того же набора данных

1 Ответ

0 голосов
/ 31 июля 2011

Вы просто воздействуете на два разных объекта, которые имеют две разные стратегии получения результата.LINQPad генерирует модель LINQ to SQL и внедряет ваш код в метод с этой моделью в области видимости.

Ваш класс STARSEntities относится к другому типу и, вероятно, имеет совершенно другое взаимодействие с базой данных.

LINQPad имеет свое собственное представление, отображающее выполняемый SQL.Вы должны сравнить его с SQL, выполняемым моделью EF.Это отображается в SQL Server Profiler при запуске.

...