2016-10-15 4 views
0

У меня есть базы данных SQL Server и два Entity Framework запроса, которые возвращают тот же результат:где производительность условие Entity Framework запроса

Query1

var query = (from dd in db.Departments 
      where (
       from D in db.Departments 
       join DP in db.DepartmentPersonnels on D.ID equals DP.DepartmentID 
       join P in db.Personnels on DP.PersonneID equals P.ID 
       where P.UserName == Username && D.Code.IndexOf(",") >= 0 
       select D.Code.Substring(0, D.Code.IndexOf(","))).Contains(dd.Code) 
       select dd).FirstOrDefault(); 

Query2

var query = (from dd in db.Departments 
      join DP in db.DepartmentPersonnels on dd.ID equals DP.DepartmentID 
      join P in db.Personnels on DP.PersonneID equals P.ID 
      where P.UserName.Trim().ToLower() == Username.Trim().ToLower() 
      select dd).FirstOrDefault(); 
if (query != null) 
{ 
    string Code = query.Code.Split(',')[0];   
    retVal = (from d in db.Departments 
    where d.Code == Code 
    select d).FirstOrDefault(); 
} 

Я прочитал работу EF во многих сообщениях, но я не нашел информации о том, где работает условие.

Я думаю, что Query2 лучше Query1 с точки зрения производительности, потому что where условие во внешнем from будет выполнено в SQL Server для каждой записи.

Это правда?

Спасибо.

+0

Посмотрите на сгенерированный SQL - Query2 приведет к 2 запросам в базе данных – ErikEJ

+0

Не угадайте, не рассудите, * measure *. Иногда поместить все в один запрос быстрее. Иногда несколько простых запросов быстрее, чем один более сложный запрос. У вас есть база данных. У вас есть код C# для доступа к этой базе данных. Вы единственный, кто способен делать разумные измерения. – hvd

+0

@hvd В базе данных очень много записей, в этом случае я думаю, что Query2 лучше. –

ответ

0

Производительность 2-го запроса лучше, чем 1-го запроса не из-за космического Where clause.You должны избегать этих операций на боковых запросов SQL сервера (т.е. IQueryable) .such, как D.Code.IndexOf(",") >= 0, D.Code.Substring(0, D.Code.IndexOf(",")) и Contains .Those операций занимает больше времени, когда вы используете его со сторонними запросами SQL Server.

Выполняйте эти операции после получения данных с сервера. Иными словами, это делается внутри памяти (например, IEnumerable). В вашем втором запросе нет таких трудоемких операций. Вот почему ваш второй запрос показывает лучшую производительность.

+0

Спасибо за ответ, я знаю, что 'Contains' и' IndexOf' потребляют время, но мне нужно больше информации из 'where'. Увеличивает ли время выполнения? –

+0

Да, конечно. Это увеличивает время выполнения. Если это сильно ухудшает производительность запроса. Так как вы упомянули выше, вам придется обрабатывать такие операции по времени в памяти. – Sampath

+0

Где НЕ увеличивает время выполнения - в большинстве случаев оно даже уменьшит его. Это связано с тем, что не так много записей должно быть реализовано - сканирование таблицы незначительно, потому что без Where, вся таблица будет возвращена в любом случае. Проблема с запросом OP заключается в том, что он содержит фильтры, которые нельзя преобразовать в простые сравнения SQL, поэтому SQL будет довольно сложным и, следовательно, займет больше времени - процессор в большинстве случаев сделает это быстрее. – DevilSuichiro

Смежные вопросы