해당 필드와 모든 값을 삭제하기로 결정했습니다. db 성능을 잃지 않고 인덱싱을 제거하지 않고 ntext 필드와 모든 값과 릴리스 공간을 삭제하는 방법이 있습니까?
(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은 하나 이상의 트랜잭션으로 실행됩니다. 일} 처리 크기를 지정 하지 않으면 명령은 하나의 트랜잭션에서 전체 테이블을 처리 하고 작업 중에 테이블이 독점적으로 잠 깁니다 . 일부 큰 테이블의 경우 단일 트랜잭션 길이와 필요한 로그 공간이 너무 클 수 있습니다. 배치 크기가 지정되면 명령은 지정된 행 수를 포함하여 일련의 트랜잭션에서 실행됩니다. 다른 트랜잭션 내에서 DBCC CLEANTABLE을 트랜잭션으로 실행할 수 없습니다.
이 작업은 완전히 기록됩니다.
간단한 재현은 DBCC CLEANTABLE
SHRINKING보다 낫다 는 것을 증명할 것 입니다 (그리고 조각화에 대한 걱정은 없습니다 :-)
-- 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') ;