Nous avons décidé de supprimer ce champ et toutes ses valeurs: existe-t-il un moyen de supprimer le champ ntext et toutes ses valeurs et de libérer de l'espace sans supprimer l'indexation, sans rétrécir, sans perdre les performances db?
Je recommanderais d'utiliser (de BOL:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE récupère de l'espace après la suppression d'une colonne de longueur variable. Une colonne de longueur variable peut être l'un des types de données suivants: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), text, ntext, image, sql_variant et xml. La commande ne récupère pas d'espace après la suppression d'une colonne de longueur fixe.
!! ATTENTION !! ( utilisez une taille de lot prudente - il est conseillé d'utiliser ce paramètre si votre table est massive) :
DBCC CLEANTABLE s'exécute comme une ou plusieurs transactions. Si aucune taille de lot n'est spécifiée, la commande traite la table entière en une seule transaction et la table est exclusivement verrouillée pendant l'opération . Pour certaines grandes tables, la longueur de la transaction unique et l'espace journal requis peuvent être trop importants. Si une taille de lot est spécifiée, la commande s'exécute dans une série de transactions, chacune comprenant le nombre de lignes spécifié. DBCC CLEANTABLE ne peut pas être exécuté en tant que transaction dans une autre transaction.
Cette opération est entièrement enregistrée.
Une simple repro prouvera que DBCC CLEANTABLE
c'est mieux que Rétrécir (et pas de souci de fragmentation :-)
-- 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') ;