LinQ-запрос имеет большую продолжительность из-за пересчета View - PullRequest
0 голосов
/ 22 сентября 2010

Я создал представление в базе данных, которое дает мне представление об организационной структуре в этот момент во времени. Действительно, я использую getdate () в этом представлении. Я импортировал представление в моем edmx и написал запросы на основе этого представления. Большинство запросов объединяют таблицу с представлением и возвращают DTO. Эти запросы работают нормально и быстро (200 мс), когда я их профилирую в профилировщике SQL.

Когда я делаю группу по объединенной таблице и просматриваю, тогда продолжительность намного больше. Как ни странно, когда я выполняю запрос LinQ, длительность очень велика, но когда я сам выполняю сгенерированный запрос в SQL Server Management Studio, он действительно быстрый. Я удостоверился, что это не было вызвано кэшированием или планами выполнения, которые уже были рассчитаны. Запрос LinQ также дает мне много операций чтения и записи, в то время как запрос через SQL Mgmt Studio не дает мне записи и намного меньше операций чтения.

У нас есть предположение, что представление необходимо пересчитывать, когда запрос выполняется через LinQ, а не когда он выполняется через SQL Mgmt Studio.

Другой подход, который я пробовал, - создать хранимую процедуру в базе данных. Этот сохраненный процесс выполняет точно такой же запрос, который сгенерировал LinQ. Я сопоставил этот сохраненный процесс в EDMX. Когда я снова вызываю сохраненный процесс через LinQ, длительность очень велика (7000 мс) и много операций чтения и записи. Когда я выполняю его через SQL Mgmt Studio, длительность будет такой, как ожидалось (200 мс), и мало чтения и без записи.

Есть предложения? Спасибо

1 Ответ

0 голосов
/ 22 сентября 2010

Похоже, что Management Studio выполняет какую-то оптимизацию плана запросов, которую LINQ не может сделать, поскольку выполняет серию отдельных команд.

Я бы предложил попытаться создать разумный наборзаписей в память и сделать соединение там.Это довольно легко сделать.

Скажем, у вас есть этот запрос:

var pcs =
    from p in dc.People
    join c in dc.Colors on p.FavColor equals c.Name
    where p.Name == "James"
    select new { p.Name, c.ColorId };

Это сгенерирует серию запросов к SQL, что может вызвать тип задержки, с которой вы столкнулись.1008 *

Попробуйте вместо этого:

var pcs =
    from p in dc.People.Where(x => x.Name == "James").ToArray()
    join c in dc.Colors.ToArray() on p.FavColor equals c.Name
    select new { p.Name, c.ColorId };

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

Надеюсь, это поможет.

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