Мы решили удалить это поле и все его значения: есть ли способ удалить поле ntext и все его значения и освободить пространство без удаления индексации, без сжатия, без потери производительности дБ?
Я бы порекомендовал использовать (от BOL:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE освобождает пространство после удаления столбца переменной длины. Столбец переменной длины может иметь один из следующих типов данных: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), текст, ntext, image, sql_variant и xml. Команда не освобождает пространство после удаления столбца фиксированной длины.
!! ВНИМАНИЕ !! ( используйте аккуратный размер пакета - желательно использовать этот параметр, если ваша таблица массивна) :
DBCC CLEANTABLE запускается как одна или несколько транзакций. Если размер пакета не указан, команда обрабатывает всю таблицу за одну транзакцию, и таблица блокируется исключительно во время операции . Для некоторых больших таблиц длина одной транзакции и требуемый объем журнала могут быть слишком большими. Если указан размер пакета, команда выполняется в серии транзакций, каждая из которых включает указанное количество строк. DBCC CLEANTABLE не может быть запущен как транзакция внутри другой транзакции.
Эта операция полностью зарегистрирована.
Простое повторение докажет, что DBCC CLEANTABLE
это лучше, чем SHRINKING (и не беспокойтесь о фрагментации :-)
-- clean up
drop table dbo.Test
-- create test table with ntext column that we will drop later
create table dbo.Test (
col1 int
,col2 char(25)
,col3 ntext
);
-- insert 1000 rows of test data
declare @cnt int;
set @cnt = 0;
while @cnt < 1000
begin
select @cnt = @cnt + 1;
insert dbo.Test (
col1
,col2
,col3
)
values (
@cnt
,'This is a test row # ' + CAST(@cnt as varchar(10)) + 'A'
,REPLICATE('KIN', ROUND(RAND() * @cnt, 0))
);
end
--drop the ntext column
ALTER TABLE dbo.Test DROP COLUMN col3 ;
--reclaim the space from the table
-- Note that my table is only having 1000 records, so I have not used a batch size
-- YMMV .. so find a maintenance window and you an appropriate batch size
-- TEST TEST and TEST before implementing in PROD.. so you know the outcome !!
DBCC CLEANTABLE('tempdb', 'dbo.Test') ;