#sql-server
#sql-сервер
Вопрос:
Я работаю над API, который предоставляет данные устаревшего представления в SQL Server и столкнулся с проблемой производительности, ответ крайне медленный. В этом представлении более 10 объединенных таблиц и какое-то сложное where
условие. Общее количество строк представления составляет около 7000.
После тестирования я обнаружил, что время выполнения связано с количеством вершин.
- Если top равен 15, это займет ~ 10 секунд
- Если top равно 50, требуется ~ 500 мс
- С помощью двоичного поиска я обнаружил, что граница равна 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. Покажите мне код представления, давайте его оптимизируем.