У меня есть хранимая процедура, которая усекает некоторые таблицы с примерно 1,75 млн строк в каждой, прежде чем вставлять новые данные (на основе данных в других таблицах, расчетов и т. Д.)
Основная схема очень проста:
- Усеченные таблицы
- Вставьте 1,75 млн рядов в «партии» около 75000 за раз.
Мне интересно, если я должен явно перестроить индексы в любое время в этом процессе? например
- Усеченные таблицы
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[или что-то подобное]- Вставьте 1,75 строки
или возможно
ALTER INDEX ALL ON xxx DISABLE
- Усеченные таблицы
- Вставьте 1,75 строки
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[или что-то подобное]
Любая помощь приветствуется ... не DBA - разработчик, который хорошо знает DB, более точен!
sql-server
performance
index
BlueChippy
источник
источник
insert into
и на данный момент нетorder by
пункта, но я мог бы добавить, что, если это поможет? ID и код также индексируются отдельно.Ответы:
Как и в большинстве вопросов такого типа, это зависит. Маловероятно, что вы будете вставлять данные в «правильном» порядке для всех задействованных индексов, а это означает, что все эти индексы могут столкнуться с большим количеством разбиений страниц в процессе вставки. Итак, давайте предположим, что вы вставляете в порядке кластерного индекса. Вы можете отключить все некластеризованные индексы, усечь, выполнить вставку, а затем перестроить все ваши некластеризованные индексы. Конечно, пробуя оба подхода, вы узнаете правду о том, что быстрее, независимо от теории. :)
источник
Plan Basic со всеми включенными индексами может работать медленно и может привести к фрагментации.
ALTER INDEX REBUILD для усеченной и, следовательно, пустой таблицы не имеет смысла, поэтому вам нужно изменить свой План A. Это должно быть:
Это все еще может быть медленным, но по крайней мере вы получите резкие показатели.
План Б в порядке. Протестируйте все три и посмотрите, какой из них самый быстрый, а какой дает наименьшую фрагментацию индекса. Затем решите, стоит ли восстановление.
источник