План выполнения SQL Server для разного количества вершин

#sql-server

#sql-сервер

Вопрос:

Я работаю над API, который предоставляет данные устаревшего представления в SQL Server и столкнулся с проблемой производительности, ответ крайне медленный. В этом представлении более 10 объединенных таблиц и какое-то сложное where условие. Общее количество строк представления составляет около 7000.

После тестирования я обнаружил, что время выполнения связано с количеством вершин.

  1. Если top равен 15, это займет ~ 10 секунд
  2. Если top равно 50, требуется ~ 500 мс
  3. С помощью двоичного поиска я обнаружил, что граница равна 30

Топ-15 и топ-50 имеют разные планы выполнения. Наконец, я добавляю option(recompile) , чтобы средний ответ составлял около 800 мс, что все еще медленно, но приемлемо.

Мой вопрос в том, почему это происходит? Есть ли какой-либо способ позволить SQL Server выбрать более быстрый план выполнения для top 15 без option(recompile) ?

Комментарии:

1. Публикация планов запросов (используйте вставить план ) и запросов была бы полезной для начала, наряду с вашим DDL VIEW .

2. Также, если вы действительно хотите сделать это быстро, рассмотрите возможность размещения всей или большей части логики представления в индексированном представлении. learn.microsoft.com/en-us/sql/relational-databases/views /…

3. @DavidBrowne-Microsoft Это представление не так часто используется, получение результата за ~ 1 с приемлемо, просто любопытно, почему это произошло, чтобы я мог справиться с аналогичной проблемой позже.

4. Проблема с целью строки может быть накоплена в вашем запросе sqlperformance.com/2018/02/sql-plan /… вы пытаетесь отключить ПОДСКАЗКУ_OPTIMIZER_ROWGOAL.

5. Покажите мне код представления, давайте его оптимизируем.