Наш проект работает с очень большой, очень сложной базой данных. Примерно месяц назад мы заметили, что пространство, используемое индексированными столбцами, содержащими нулевые значения, становится слишком большим. В ответ на это я написал в виде сценария, который будет динамически выполнять поиск по всем одноколоночным индексам, содержащим более 1% нулевых значений, а затем отбрасывать и воссоздавать эти индексы как отфильтрованные индексы при условии, что значение равно NOT NULL. Это приведет к удалению и воссозданию сотен индексов по всей базе данных и, как правило, освобождает почти 15% пространства, используемого всей БД.
Теперь у меня есть два вопроса по этому поводу:
А) Каковы недостатки использования фильтрованных индексов таким способом? Я бы предположил, что это только улучшит производительность, но есть ли какие-либо риски производительности?
B) Мы получили ошибки ( «не могу удалить индекс XYZ, потому что он не существует или у вас нет разрешения» ) при удалении и повторном создании индексов, хотя при последующей проверке все прошло точно так, как ожидалось. Как это может случиться?
Спасибо за любую помощь!
Изменить: в ответ на @ Томас Кейсер
Привет и спасибо, но оказалось, что это была катастрофа. В то время мы не понимали несколько вещей, таких как:
- Во время запроса SQLOS создает планы индекса, прежде чем определить, что он не может использовать значения NULL для объединения столбцов таблицы. IE, вам действительно нужно иметь фильтр предложения WHERE, соответствующий индексу для каждого отфильтрованного индекса, используемого в запросе, иначе индекс не будет использоваться вообще.
- Удаление и создание индексов и избыточное обновление их статистики еще раз после этого может оказаться недостаточным для создания обновленных планов, как мы и предполагали. В некоторых случаях оказывается, что только достаточно высокая рабочая нагрузка заставит SQL Server пересмотреть планы.
- Есть некоторые экзотические черты в функциональности планировщика выполнения, которые трудно определить только с помощью здравого смысла и логики. Благодаря тысячам сгенерированных с помощью кода вариаций различных запросов даже, казалось бы, бесполезные индексы могут помочь в некоторых статистических данных и планах запросов, которые в конечном итоге используются в критических запросах.
В итоге эти изменения были отменены. Таким образом, отфильтрованные индексы являются мощным инструментом, но вы должны точно понимать, какие данные выбираются из этих столбцов. Там, где обычные индексы помимо проблем с пространством довольно просты в применении, отфильтрованные индексы представляют собой очень индивидуальные решения. Они, конечно, не являются заменой для обычного индекса, а скорее являются дополнением к ним в тех особых обстоятельствах, которые им необходимы.