Удаление 10 тыс. Записей из кластеризованного индекса + 5 некластеризованных записей не должно занимать 1 минуту. Похоже, у вас действительно очень медленный подсистема ввода-вывода. Какие значения для:
- Avg. Дисковая сек / запись
- Avg. Диск с / Чтение
- Avg. Длина очереди записи на диск
- Avg. Длина очереди чтения с диска
На каждом диске, участвующем в операции (включая журналы!). Если вы поместили индексы в отдельные файловые группы и разместили каждую файловую группу для своего собственного LUN или собственного диска, то вы можете определить, какие индексы являются более проблематичными. Кроме того, сбрасывание журнала может быть серьезным узким местом. SQL Server здесь не имеет большого контроля, все в ваших руках, как ускорить процесс. это время не тратится на циклы ЦП, тратится на ожидание завершения ввода-вывода, и вам нужна подсистема ввода-вывода, откалиброванная для требуемой нагрузки.
Чтобы уменьшить нагрузку ввода-вывода, вам нужно сделать индексы более узкими. Прежде всего, убедитесь, что кластеризованный индекс является самым узким из возможных. Затем убедитесь, что некластеризованные индексы не содержат неиспользуемые большие столбцы (я видел это ...). Основное преимущество можно получить, включив сжатие страниц . И, наконец, проверьте статистику использования индекса в sys.dm_db_index_usage_stats и посмотрите, подходит ли какой-либо индекс для топора.
Если вы не можете значительно уменьшить нагрузку ввода-вывода, попробуйте разделить ее. Добавьте файловые группы в базу данных, переместите большие индексы в отдельные файловые группы, поместите файловые группы в отдельные пути ввода-вывода (отдельные шпиндели).
Для будущих регулярных операций удаления лучше всего использовать переключение разделов, выровнять все индексы по разделам кластеризованного индекса, а когда наступит время, просто отбросить последний раздел для молниеносного удаления.