2013-05-16 4 views
1

Итак, у меня есть запрос linq, где s1.code происходит от объекта до этого запроса linq.Linq Query Оптимизация объединения таблиц

var q1 = from cf in db.Control_Franchises 
     join t1 in db.Territories 
      on  SqlFunctions.StringConvert((double)cf.FranchiseID).Trim() 
      equals t1.FranchiseID.Trim() 
     join cu in db.Control_Users on t1.FK_CompanyID equals cu.PrimaryCompanyID 
     join u in db.Users on cu.UserID.ToLower() equals u.Username.ToLower() 
     where cf.Status == "ACTIVE" 
      && cf.FranchiseID > 1000 
      && cu.UserType == "Franchisee" 
      && cu.Status == "ACTIVE" 
      && t1.Province == s1.Code 
     orderby cu.LastName ascending, cf.FranchiseID ascending 
     select new 
     { 
      FranchiseId = cf.FranchiseID, 
      Province = cf.StateCode, 
      DisplayName = cu.LastName + ", " + cu.FirstName, 
      UserId = u.PK_UserID 
     }; 

У меня есть один и тот же блок кода, но на этот раз в моем где положение, я изменил фильтр с помощью t1.Province == s1.Code к cf.StateCode == s1.Code

var q1 = from cf in db.Control_Franchises 
     join t1 in db.Territories 
      on  SqlFunctions.StringConvert((double)cf.FranchiseID).Trim() 
      equals t1.FranchiseID.Trim() 
     join cu in db.Control_Users on t1.FK_CompanyID equals cu.PrimaryCompanyID 
     join u in db.Users on cu.UserID.ToLower() equals u.Username.ToLower() 
     where cf.Status == "ACTIVE" 
      && cf.FranchiseID > 1000 
      && cu.UserType == "Franchisee" 
      && cu.Status == "ACTIVE" 
      && cf.StateCode == s1.Code  // DIFFERENT FROM ABOVE 
     orderby cu.LastName ascending, cf.FranchiseID ascending 
     select new 
     { 
      FranchiseId = cf.FranchiseID, 
      Province = cf.StateCode, 
      DisplayName = cu.LastName + ", " + cu.FirstName, 
      UserId = u.PK_UserID 
     }; 

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

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

Любые мысли?

+1

Я не вижу никакой разницы между этими двумя запросами ... Есть один, что Мне не хватает? Они даже называются 'q1'. –

+0

Какие типы 'StateCode' и' Province'? Обе строки? Я предполагаю, что это проверка адресов U.S. против не-U.S или что-то еще ... если это так, возможно ли, что первый запрос работает быстрее только потому, что у вас меньше записей без U.S? –

+1

@ DanielHilgarth в 'where', последний' && 'd термин отличается. О внесении изменений, чтобы это не требовало hcrolling, чтобы увидеть ... @foop при отправке блоков кода, если можно, приятно перерисовать текст по мере необходимости, чтобы в результирующем кодовом блоке не была горизонтальная полоса прокрутки. – AakashM

ответ

3

Скорее всего, эти две разные столбцы t1.Province и cf.StateCode индексируются по-разному в источнике данных (или один не совсем)

+0

Вот и все. * вздох * радости наследования устаревшей базы данных с существующей системой. – foop

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