Ми вирішили видалити це поле та всі його значення: Чи є спосіб видалити поле ntext та всі його значення та звільнити простір, не видаляючи індексацію, не зменшуючи, не втрачаючи продуктивність db?
Я б рекомендував використовувати (від 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') ;