Я использую Linq To Entities (L2E) ТОЛЬКО для сопоставления всех моих хранимых процедур в моей базе данных для легкого перевода в объекты. Мои данные не очень конфиденциальны (поэтому я рассматриваю уровень изоляции "ЧИТАЙТЕ НЕКОММИТИРОВАННЫМ" везде). У меня есть несколько таблиц с миллионами строк. У меня есть веб-сайт и куча сценариев, использующих ту же модель данных, созданную с использованием Entity Framework. Я проиндексировал все таблицы (максимум 3 для каждой таблицы), чтобы каждый фильтр, который я использую, непосредственно отслеживался индексом. Мои сценарии в основном состоят из
1) Получить из БД (~ 5 секунд)
2) Создание API (1-3 секунды)
3) Добавление результата в базу данных
У меня для READ_COMMITTED_SNAPSHOT и ALLOW_SNAPSHOT_ISOLATION установлено значение ON.
При использовании этой стратегии большинство моих запросов фиксированные и очень быстрые (обычно). У меня все еще есть некоторые запросы, используемые моими сценариями, которые могут работать до 20 секунд, но их не так часто называют.
Проблема в том, что внезапно вся база данных становится медленной и все мои запросы возвращаются медленно (может занять более 10 секунд). Используя Sql Profiler, я попытался найти проблему.
Как уже упоминалось, я рассматриваю NOLOCKS, используя "READ UNCOMMITED" ... Прямо сейчас я рассматриваю каждый возможный вызов базы данных и добавляю индексы и / или кэширующие таблицы, чтобы сделать вызов быстрее.
Я также рассмотрел удаление L2E и доступ к «старому способу», чтобы убедиться, что это не проблема. Мой контекст данных просматривает мои таблицы? это так выглядит. Я экспериментировал с контекстом, живущим над вызовом API, чтобы минимизировать созданный контекст, но сейчас я создаю новый контекст для каждого вызова, так как думал, что он просматривает базу данных.
Проблема в том, что я не могу контролировать, чтобы каждый отдельный звонок совершался быстро, на протяжении всей вечности, иначе вся система замедляется.
Когда я перезагружаю SQL Server и перестраиваю индексы, он действительно быстро работает в течение короткого периода времени, прежде чем все снова станет медленным. Любые указатели будут оценены.