Запрос Linq супер медленный? - PullRequest
2 голосов
/ 25 марта 2011

Я скопировал SQL-запрос, созданный linq, из SQL-профилировщика. Вот что раздражает:

  1. Это префиксы select ..columnNames .. from (select ..columnNames .. from(выберите cNames из поля просмотра) Комментарии: 2 оператора select здесь не нужны.

  2. этот запрос занимает 14 секунд для выполнения

  3. при удалениипоследняя строка, содержащая все параметры, такие как @ p_ linq _0 .., и заполняет значения параметров в условии и выполняет тот же самый динамический запрос, который занимает 1 секунду или меньше. Даже в противном случае этот запрос принимает0 секунд при выполнении из sql studio. Это так хромает linq.

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

Последальнейшие исследования я обнаружил:

Запрос 1:

exec sp_executesql N'SELECT * from TableView WHERE Id = @Id', N'@Id int', @Id = 1

Запрос 2:

exec sp_executesql N'SELECT * from TableView WHERE Id = 1'

Запрос 1 занимает 12 секунд, Запрос 2 занимает 0 секунд. Это объясняетпочему linq-запрос медленный. Так значит ли это, что я всегда должен использовать stor?Процедуры или я что-то упустил?

Почему Microsoft не может исправить построение запросов Linq, насколько сложно проанализировать эту строку и заменить значения параметров вместо передачи этих параметров в качестве аргументов sp_executesql

Ответы [ 3 ]

6 голосов
/ 25 марта 2011

Я с тобой.Я имею в виду, что вы могли бы, вероятно, раскрыть причину этого катастрофического удара производительности, которую вы обнаружили, и найти лекарство.Но на практике такого рода вещи случаются с Linq to SQL и тратят это дополнительное время на оптимизацию вашего оператора Linq, чтобы SQL-запрос был более производительным по отношению к внутреннему виду, что не отвечает этой цели.Предполагается, что Linq сделает все проще.

Лично я использую Linq-to-SQL или Entity Framework для выполнения операций CRUD над отдельными записями.И затем с любыми большими SELECT операторами я просто напишу сохраненный процесс, как я всегда делал.Похоже, это хороший компромисс между производительностью и производительностью, который хорошо сработал для меня.

РЕДАКТИРОВАТЬ: На самом деле ребята из Entity Framework ожидали этого.А Entity Framework прекрасно работает с хранимыми процедурами.Вы можете добавить сохраненный процесс к вашей модели Entity Framework и получить все эти строгие качества.Затем вы можете вызвать этот сохраненный процесс из кода.

0 голосов
/ 25 марта 2011

Это будет работать.

ParameterExpression parameterExpression = Expression.Parameter(typeof(TableView), "v");
Expression equalsExpression = Expression.Equal(Expression.Property(parameterExpression, "Id"), Expression.Constant(Id));
Expression<Func<TableView, bool>> predicate = Expression.Lamda<Func<TableView, bool>>(equalsExpression, parameter);

var query = from v in tableView
            orderby v.RDate descending
            select v;

if(!daysRange.Equals("All"))
{
  query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate);
}

query.Where(predicate).ToList();
0 голосов
/ 25 марта 2011

Вы должны построить предикат Where, динамически извлекая специфичный для приложения daysRange, вот так

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