Bu alanı ve tüm değerlerini silmeye karar verdik: Ntext alanını ve tüm değerlerini silmenin ve alanı indekslemeyi kaldırmadan, küçülmeden, db performansını kaybetmeden silmenin bir yolu var mı?
(BOL: 'dan) tavsiye ederim
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLE, değişken uzunlukta bir sütun bırakıldıktan sonra alanı geri kazanır. Değişken uzunlukta bir sütun aşağıdaki veri türlerinden biri olabilir: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), metin, ntext, resim, sql_variant ve xml. Sabit uzunlukta bir sütun bırakıldıktan sonra komut alanı geri almaz.
!! DİKKAT !! ( dikkatli bir toplu iş boyutu kullanın - tablonuz çok büyükse bu parametreyi kullanmanız önerilir) :
DBCC CLEANTABLE bir veya daha fazla işlem olarak çalışır. Bir parti boyutu ise değildir belirtilen, komut bir işlemde bütün tablo işler ve tablo özel işlem sırasında kilitlenir . Bazı büyük tablolar için, tek işlemin uzunluğu ve gereken günlük alanı çok fazla olabilir. Bir toplu iş boyutu belirtilirse, komut, her biri belirtilen sayıda satır içeren bir dizi işlemde çalışır. DBCC CLEANTABLE başka bir işlem içinde işlem olarak çalıştırılamaz.
Bu işlem tamamen günlüğe kaydedilir.
Basit bir repro DBCC CLEANTABLE
SHRINKING (ve parçalanma endişesi yok) daha iyi olduğunu kanıtlayacaktır :-)
-- 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') ;