테이블 필드를 제거한 후 디스크 공간 확보


16

나는 sql 2008 r2를 실행 중이며 약 3 개월 전까지 매우 활발하고 사용되는 테이블에 ntext 필드를 추가 할 때까지 지난 3 년 동안 db가 훌륭하고 빠르게 작동했습니다. 이제이 테이블의 크기가 크게 확장되어 서버 공간에서 벗어나기 시작했습니다.

나는 축소하는 것을 읽었습니다 .DB의 색인 생성을 몇 년 동안 빠르게 수행했기 때문에 느슨하게하고 싶지 않으며 조각화가 끝나고 싶지 않습니다.

해당 필드와 모든 값을 삭제하기로 결정했습니다. db 성능을 잃지 않고 인덱싱을 제거하지 않고 ntext 필드와 모든 값과 릴리스 공간을 삭제하는 방법이 있습니까?

지난 5 개월 동안의 크기 확장을 보여주기 위해 DB 크기 쿼리 출력을 첨부하고 있습니다.

여기에 이미지 설명을 입력하십시오

답변:


12

해당 필드와 모든 값을 삭제하기로 결정했습니다. 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 CLEANTABLESHRINKING보다 낫다 는 것을 증명할 것 입니다 (그리고 조각화에 대한 걱정은 없습니다 :-)

-- 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') ;

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


DBCC CLEANTABLE 명령을 실행 한 후 공간을 확보하기 위해 테이블에 인덱스가있는 경우 클러스터 된 인덱스를 다시 빌드해야합니다. YourTable의 ALTER INDEX IndexName이 새로워졌습니다.
Mr. TA

6

대부분의 경우 Paul Randall의 Inside 스토리지 엔진 블로그 시리즈를 참조합니다.

SQLServer의 데이터베이스 파일에서 사용되지 않은 공간을 회수하는 유일한 방법은 DBCC SHRINK 명령을 사용하여 데이터베이스 파일 해제 페이지에서 데이터를 재 할당하고 Global Allcation 맵에서 제거한 후 데이터베이스 파일에서 제거하는 것입니다. 이 조작은 느리고 데이터베이스 내에서 조각화를 작성하며 LOB 페이지를 데이터베이스 파일 내에 링크 된 목록으로 저장하므로 LOB 페이지를 처리 ​​할 때 훨씬 느립니다.

NTEXT 열을 삭제하기 때문에 축소하기 전에 고스트 정리 프로세스가 데이터를 삭제하기를 기다려야합니다.

이제 데이터베이스 파일에 많은 여유 공간이 있으면 실제로 아무런 해를 끼치 지 않을 것입니다. 디스크 공간이 있으면 백업 압축이 파일 내의 여유 공간을 처리합니다.

파일을 더 작게 만들려면 데이터베이스를 사용하여 새 파일 그룹을 만들고 기본값으로 만든 다음 테이블을 새 파일 그룹으로 옮길 수 있지만 시간이 걸리고 다운 타임이 발생할 수 있습니다. 나는 Bob Pusateri여기에 설명 된 기술 을 좋은 결과로 사용했습니다.


고스트 정리 프로세스가 공간을 줄이거 나 축소도 필요합니까?
user1021182

정리 프로세스는 할당 된 페이지 만
비우지 만

1
@ Spörri 제 답변을Since you are dropping the NTEXT column you will have to wait for the ghost cleanup process to drop the data before shrinking. 참조하십시오 . 공간을 해제하는 데 사용할 수 있습니다 . DBCC CLEANTABLE
Kin Shah

4

다른 데이터베이스 / 비 DB 파일에 필요한 공간이 필요하거나이 데이터베이스에 공간이 부족하여 문제가 발생하여 데이터베이스 파일을 축소 하시겠습니까?

그것이 두 번째라면 생각만큼 큰 문제가 없을 수 있습니다. 내가 맞다면 문제는 새로운 데이터를위한 추가 공간을 확보하기 위해 데이터베이스를 확장해야 할 때입니다. 열을 제거하면 해당 열이 차지하는 모든 공간이 해제되어 데이터베이스의 테이블에 새 행이 추가됩니다. 이것은 데이터베이스가 커지기 전에 더 오래 걸리는 것을 의미합니다. 그 동안에는 데이터 드라이브를위한 추가 공간이 확보 될 것입니다. 대부분의 데이터베이스는 시간이 지남에 따라 커지므로 드라이브에 여유 공간이있는 것이 좋습니다.


우리는 디스크 공간에 10GB 만 남았으며 며칠 안에 다 떨어질 것입니다. 서버에서 제거 할 수있는 모든 것을 제거하고 정리를 사용하고 Windows 업데이트를 중지하고 모든 것을 제거하고 winsxs를 정리 했으므로 이제 db 파일의 크기를 줄여야합니다.
user1021182

다시 한 번 여분의 열을 삭제하면 여유 공간을 채우는 동안 DB 증가가 한동안 중지됩니다. 이 시점 이후에도 DB가 계속 커지면 데이터베이스를위한 추가 디스크 공간이 필요합니다. 서버에 새 드라이브를 추가 할 수 있습니다.
Kenneth Fisher

0

문제가되는 열없이 미러 테이블을 만들고 모든 데이터를이 테이블에 복사하고 원본을 삭제 한 다음 미러 테이블의 이름을 바꿉니다.


이 경우 모든 인덱스도 준비해야합니다.
user1021182

트리거 : 예 테이블에 영향을 미치는 모든 인덱스는 테이블의 예를 참조하는 다른 개체에 적용됩니다 .... 하락 및도 다시해야합니다
ardochhigh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.