Decidimos excluir esse campo e todos os seus valores: Existe uma maneira de excluir o campo ntext e todos os seus valores e liberar espaço sem remover a indexação, sem encolher, sem perder o desempenho do banco de dados?
Eu recomendaria usar (da BOL:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE recupera espaço depois que uma coluna de comprimento variável é descartada. Uma coluna de comprimento variável pode ser um dos seguintes tipos de dados: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), texto, ntext, imagem, sql_variant e xml. O comando não recupera espaço depois que uma coluna de comprimento fixo é descartada.
!! ATENÇÃO !! ( use um tamanho de lote cuidadoso - é aconselhável usar esse parâmetro se sua tabela for grande) :
DBCC CLEANTABLE é executado como uma ou mais transações. Se um tamanho de lote não for especificado, o comando processará a tabela inteira em uma transação e a tabela será bloqueada exclusivamente durante a operação . Para algumas tabelas grandes, o comprimento da transação única e o espaço de log necessário podem ser muito. Se um tamanho de lote for especificado, o comando será executado em uma série de transações, cada uma incluindo o número especificado de linhas. DBCC CLEANTABLE não pode ser executado como uma transação dentro de outra transação.
Esta operação está totalmente registrada.
Um simples repro provará que DBCC CLEANTABLEé melhor que SHRINKING (e não se preocupe com fragmentação :-)
-- 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') ;

