Чтение базы данных сильно различается в запросах с индексами

У меня есть запрос с соответствующими индексами, который показан в плане запроса с оценочной стоимостью поддерева примерно 1,5. План показывает поиск индекса, с последующим поиском по ключу - что нормально для запроса, который должен вернуть 1 строку из набора от 5 до 20 строк (т. е. поиск по индексу должен найти от 5 до 20 строк, а после 5-20 поисков по ключу мы должны вернуть 1 row).

При интерактивном выполнении запрос возвращается почти сразу. Однако DB отслеживает время выполнения этого утреннего шоу в реальном времени (веб-приложение), которое сильно различается; обычно запрос занимает <100 чтений из БД и фактически 0 времени выполнения ... но мы получаем несколько прогонов, которые потребляют> 170 000 чтений из БД и время выполнения до 60 секунд (больше, чем наше значение тайм-аута).

Что могло бы объяснить эта вариация в диск читает? Я пробовал сравнивать запросы в интерактивном режиме и использовать планы фактического выполнения из двух параллельных прогонов со значениями фильтров, взятыми из быстрых и медленных прогонов, но в интерактивном режиме они фактически не показывают разницы в используемом плане.

Я также попытался определить другие запросы, которые могут блокировать этот, но я не уверен, что это так сильно повлияет на чтение БД ... и в любом случае этот запрос, как правило, был худшим для времени выполнения в моих журналах трассировки .

Обновление: Вот образец плана, созданного при интерактивном выполнении запроса:

alt text

Пожалуйста, проигнорируйте текст «отсутствует индекс». Верно , что изменения в текущих индексах могут позволить более быстрый запрос с меньшим количеством поисков, но здесь проблема не в этом (уже есть соответствующие индексы). Это план выполнения Фактический , в котором мы видим такие цифры, как Фактическое количество строк. Например, при поиске по индексу фактическое количество строк - 16, а стоимость ввода-вывода - 0,003. Стоимость ввода-вывода такая же, как и при поиске ключа.

Обновление 2: Результаты трассировки для этого запроса:

exec sp_executesql N'select [...column list removed...] from ApplicationStatus where ApplicationGUID = @ApplicationGUID and ApplicationStatusCode = @ApplicationStatusCode;',N'@ApplicationGUID uniqueidentifier,@ApplicationStatusCode bigint',@ApplicationGUID='ECEC33BC-3984-4DA4-A445-C43639BF7853',@ApplicationStatusCode=10

Запрос создается с использованием класса Gentle.Framework SqlBuilder, который строит параметризованные запросы, подобные этому:

SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(ApplicationStatus));
sb.AddConstraint(Operator.Equals, "ApplicationGUID", guid);
sb.AddConstraint(Operator.Equals, "ApplicationStatusCode", 10);
SqlStatement stmt = sb.GetStatement(true);
IList apps = ObjectFactory.GetCollection(typeof(ApplicationStatus), stmt.Execute());
6
задан Nij 11 September 2010 в 06:25
поделиться