Когда мы добавляем или удаляем новый индекс, чтобы ускорить что-то, мы можем замедлить что-то еще.
Для защиты от таких случаев после создания нового индекса я делаю следующие шаги:
- запустить профилировщик,
- запустить скрипт SQL, который содержит много запросов, которые я не хочу замедлять
- загрузить трассировку из файла в таблицу,
- анализирует ЦП, считывает и записывает данные трассировки по результатам предыдущих запусков, прежде чем я добавил (или удалил) индекс.
Это отчасти автоматизировано и делает то, что я хочу. Однако я не уверен, есть ли лучший способ сделать это. Есть ли какой-нибудь инструмент, который делает то, что я хочу?
Редактировать 1 Человек, который проголосовал за закрытие моего вопроса, не могли бы вы объяснить свои причины?
Редактировать 2 Я погуглил, но не нашел ничего, что объясняло бы, как добавление индекса может замедлить выбор. Однако это общеизвестный факт, поэтому где-то должно быть что-то. Если ничего не получится, я могу написать несколько примеров позже.
Редактировать 3 Один из таких примеров: два столбца сильно коррелируют, например, рост и вес. У нас есть индекс по высоте, который недостаточно избирателен для нашего запроса. Мы добавляем индекс по весу и запускаем запрос с двумя условиями: диапазон по росту и диапазон по весу. поскольку оптимизатор не знает о корреляции, он сильно недооценивает мощность нашего запроса.
Другой пример - добавление индекса по возрастающему столбцу, например OrderDate, может серьезно замедлить запрос с условием вроде OrderDate> SomeDateAfterCreatingTheIndex.