Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой статье показано, как устранить проблему, которую не может быть выпущена таблица после удаления всех данных из таблицы с помощью инструкции DELETE.
Исходная версия продукта: SQL Server
Исходный номер базы знаний: 913399
Симптомы
После использования инструкции DELETE в Microsoft SQL Server для удаления данных из таблицы можно заметить, что пространство, используемое таблицей, не полностью освобождается. При попытке вставить данные в базу данных может появиться следующее сообщение об ошибке:
Не удалось выделить пространство для объекта TableName в базе данных DatabaseName, так как файловая группа PRIMARY заполнена.
Примечание.
TableName представляет имя таблицы. DatabaseName представляет имя базы данных, содержащей таблицу.
Причина
Эта проблема возникает, так как SQL Server освобождает только все страницы, которые использует таблица кучи, если выполняются следующие условия:
- Удаление этой таблицы происходит.
- Хранится блокировка уровня таблицы.
Примечание.
Таблица кучи — это любая таблица, которая не связана с кластеризованным индексом.
Если страницы не освобождены, другие объекты в базе данных не могут повторно использовать страницы.
Однако при включении уровня изоляции строк versioning-based в базе данных SQL Server страницы не могут быть освобождены, даже если удерживается блокировка на уровне таблицы. Дополнительные сведения об уровнях изоляции строк versioning-based см. в разделе "Уровни изоляции" в ядро СУБД SQL Server.
Обходное решение
Чтобы обойти эту проблему, используйте один из следующих методов:
Добавьте указание TABLOCK в инструкцию DELETE, если уровень изоляции на основе строк не включен. Например, используйте инструкцию, аналогичную следующей:
DELETE FROM <TableName> WITH (TABLOCK)Примечание.
<TableName> представляет имя таблицы.
Используйте инструкцию TRUNCATE TABLE, если вы хотите удалить все записи в таблице. Например, используйте инструкцию, аналогичную следующей:
TRUNCATE TABLE <TableName>Создайте кластеризованный индекс в столбце таблицы. Дополнительные сведения о создании кластеризованного индекса в таблице см. в разделе "Создание кластеризованных индексов".