SQL использует много процессора - PullRequest
1 голос
/ 26 ноября 2011

У меня есть задание синхронизации базы данных, где я зацикливаю более 1000 строк в XML и обновляю таблицы БД с любыми изменениями, найденными в XML, используя EF4.1

Мой код:

using (context = new MyDbContext())
 {
      foreach (var row in document.Elements("row"))
      {
           //DO UPDATING IN HERE.
           //Part of which I call
            var results = context.Set(type).SqlQuery("select top 1 * from " + type.Name + " where ExternalId=@p0", id);  // this is the SQL running too long
              return results.Cast<MyObject>().FirstOrDefault();
        }
}

Запрос "Select top 1 ...", похоже, не выполнен. В чем может быть проблема. Должен ли я объявить свой контекст в цикле For?

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Я могу видеть, что это медленное объяснение, состоит в том, что у вас нет индекса на ExternalId в таблице, к которой вы запрашиваете - поэтому вы выполняете полное сканирование таблицы вместо поиска по индексу.

Ваш запрос в настоящее время не имеет особого смысла - у вас есть foreach, но вы возвращаете первый результат, который вы загружаете - зачем тогда цикл?

Другая проблема, если запустить его в циклеявляется то, что вы делаете N обходов базы данных, которые являются очень дорогостоящими.Если вы просто пытаетесь загрузить набор сущностей, которые соответствуют некоторым идентификаторам, найденным в вашем XML, я бы вместо этого загрузил их в виде пакетов.Просто выполните запрос Contains() и передайте массив идентификаторов.

0 голосов
/ 26 ноября 2011

Рекомендуется сначала загрузить все данные из базы данных, а затем обновить каждый объект в foreach при сборе результатов.

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