Удаление и повторная сборка больших объектов
При удалении или перестроении больших индексов либо удалении или усечении больших таблиц компонент SQL Server 2005 Database Engine откладывает фактическое освобождение страниц и взаимосвязанных блокировок до момента фиксации транзакции. В многопользовательской среде поддерживаются как автоматически, так и явно фиксируемые транзакции, которые могут применяться к большим таблицам и индексам, состоящим более чем из 128 экстентов.
Компонент Database Engine избегает блокировки размещения, требуемой для удаления больших объектов, с помощью разделения процесса на две стадии: логическую и физическую.
На логическом этапе существующие единицы распределения, используемые в таблице, помечаются как освобождаемые и блокируются до момента фиксации транзакции. При удалении кластеризованного индекса строки данных копируются, а затем перемещаются в кучу или новое расположение, предназначенное для хранения перестроенных кластеризованных индексов. (В случае перестроения индексов строки данных дополнительно подвергаются сортировке.) При откате происходит откат только данной логической стадии.
Физическая стадия удаления начинается после фиксации транзакции. Единицы распределения, помеченные как освобождаемые, физически удаляются одним пакетом. Эти операции удаления проводятся в коротких транзакциях, выполняемых в фоновом режиме и не требующих большого количества памяти.
В силу того, что физическая стадия начинается после фиксации транзакции, дисковое пространство таблицы или индекса может оставаться недоступным в течение некоторого времени. Если указанное дисковое пространство требуется для расширения таблицы до завершения физической стадии удаления, компонент Database Engine пытается высвободить пространство, занятое единицами распределения, помеченными как освобождаемые. Для определения пространства, занимаемого указанными единицами распределения в данный момент, используйте представление каталога sys.allocation_units.
Отложенные операции удаления не сразу освобождают выделенное им пространство, что приводит к дополнительным временным затратам компонента Database Engine. Поэтому таблицы и индексы, занимающие менее 128 экстентов, удаляются, усекаются и восстанавливаются такими же методами, что и в SQL Server 2000. То есть при их удалении логическая и физическая стадии заканчиваются до момента фиксации транзакции.