そのフィールドとそのすべての値を削除することにしました:ntextフィールドとそのすべての値を削除し、インデックスを削除せず、縮小せずに、dbのパフォーマンスを失うことなくスペースを解放する方法はありますか?
使用することをお勧めします(BOLから:)
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
DBCC CLEANTABLEは、可変長列が削除された後にスペースを再利用します。可変長列は、varchar、nvarchar、varchar(max)、nvarchar(max)、varbinary、varbinary(max)、text、ntext、image、sql_variant、およびxmlのいずれかのデータ型にすることができます。このコマンドは、固定長列が削除された後、スペースを再利用しません。
!! 注意 !! (注意深いバッチサイズを使用します-テーブルが大きい場合は、このパラメーターを使用することをお勧めします):
DBCC CLEANTABLEは、1つ以上のトランザクションとして実行されます。バッチサイズが指定されていない場合、コマンドは1つのトランザクションでテーブル全体を処理し、操作中はテーブルが排他的にロックされます。一部の大きなテーブルでは、単一のトランザクションの長さと必要なログスペースが大きすぎる場合があります。バッチサイズが指定されている場合、コマンドは一連のトランザクションで実行され、各トランザクションには指定された行数が含まれます。DBCC CLEANTABLEは、別のトランザクション内のトランザクションとして実行できません。
この操作は完全に記録されます。
単純な再現はDBCC CLEANTABLE
、縮小よりも優れていることを証明します(断片化の心配はありません:-)
-- 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') ;