Decidimos eliminar ese campo y todos sus valores: ¿Hay alguna forma de eliminar el campo ntext y todos sus valores y liberar espacio sin eliminar la indexación, sin reducir, sin perder el rendimiento de db?
Recomendaría usar (de BOL:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE reclama espacio después de que se descarta una columna de longitud variable. Una columna de longitud variable puede ser uno de los siguientes tipos de datos: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), text, ntext, image, sql_variant y xml. El comando no reclama espacio después de que se descarta una columna de longitud fija.
!! PRECAUCION !! ( use un tamaño de lote cuidadoso ; es recomendable usar este parámetro si su tabla es masiva) :
DBCC CLEANTABLE se ejecuta como una o más transacciones. Si no se especifica un tamaño de lote , el comando procesa toda la tabla en una transacción y la tabla se bloquea exclusivamente durante la operación . Para algunas tablas grandes, la longitud de la transacción individual y el espacio de registro requerido pueden ser demasiado. Si se especifica un tamaño de lote, el comando se ejecuta en una serie de transacciones, cada una de las cuales incluye el número especificado de filas. DBCC CLEANTABLE no se puede ejecutar como una transacción dentro de otra transacción.
Esta operación está completamente registrada.
Una simple reproducción demostrará que DBCC CLEANTABLE
es mejor que SHRINKING (y no te preocupes por la fragmentación :-)
-- 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') ;