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') ;