Abbiamo deciso di eliminare quel campo e tutti i suoi valori: esiste un modo per eliminare il campo ntext e tutti i suoi valori e liberare spazio senza rimuovere l'indicizzazione, senza ridurre, senza perdere le prestazioni del db?
Consiglierei di usare (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 lo spazio dopo l'eliminazione di una colonna di lunghezza variabile. Una colonna a lunghezza variabile può essere uno dei seguenti tipi di dati: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), text, ntext, image, sql_variant e xml. Il comando non recupera lo spazio dopo l'eliminazione di una colonna di lunghezza fissa.
!! ATTENZIONE !! ( usa una dimensione batch attenta : è consigliabile utilizzare questo parametro se la tabella è enorme) :
DBCC CLEANTABLE viene eseguito come una o più transazioni. Se non viene specificata una dimensione batch , il comando elabora l'intera tabella in una transazione e la tabella viene bloccata esclusivamente durante l'operazione . Per alcune tabelle di grandi dimensioni, la lunghezza della singola transazione e lo spazio di log richiesto potrebbero essere eccessivi. Se viene specificata una dimensione batch, il comando viene eseguito in una serie di transazioni, ciascuna delle quali include il numero specificato di righe. DBCC CLEANTABLE non può essere eseguito come transazione all'interno di un'altra transazione.
Questa operazione è completamente registrata.
Una semplice riproduzione dimostrerà che DBCC CLEANTABLE
è meglio di SHRINKING (e non preoccuparti della frammentazione :-)
-- 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') ;