DBCC DBREINDEX 테이블의 인덱스를 재 작성

 

https://msdn.microsoft.com/ko-kr/library/ms181671.aspx

 

 

DBCC DBREINDEX는 테이블의 특정 인덱스나 테이블에 정의된 모든 인덱스를 다시 작성합니다. DBCC DBREINDEX는 인덱스를 동적으로 다시 작성할 수 있도록 하므로 PRIMARY KEY나 UNIQUE 제약 조건을 보장하는 인덱스를 다시 작성할 때 기존 제약 조건을 삭제하고 다시 만들 필요가 없습니다. 이는 테이블의 구조나 해당 제약 조건에 대한 정보가 없이도 인덱스를 다시 작성할 수 있음을 의미합니다. 이 과정은 테이블로 데이터를 대량 복사한 후 발생할 수 있습니다.

DBCC DBREINDEX를 사용하면 하나의 문으로 한 테이블에 대한 모든 인덱스를 다시 작성할 수 있으며 이는 DROP INDEX 및 CREATE INDEX 문을 여러 번 코딩하는 것보다 쉽습니다. 각 DROP INDEX와 CREATE INDEX 문이 원자성을 가지려면 트랜잭션을 사용해야 하는 반면 DBCC DBREINDEX는 하나의 문에서 작업이 수행되므로 자동으로 원자성을 갖습니다. 또한 DBCC DBREINDEX는 개별 DROP INDEX 및 CREATE INDEX 문보다 더 많은 최적화를 제공합니다.

DBCC INDEXDEFRAG 또는 REORGANIZE 옵션을 가진 ALTER INDEX와는 달리 DBCC DBREINDEX는 오프라인 작업입니다. 비클러스터형 인덱스를 다시 작성하는 경우 작업 중에 해당 테이블에 공유 잠금이 유지됩니다. 이렇게 하면 테이블을 수정할 수 없습니다. 클러스터형 인덱스를 다시 작성하는 경우 배타적 테이블 잠금이 설정됩니다. 이 작업은 테이블에 액세스할 수 없게 하므로 결과적으로 테이블을 오프라인 상태로 만듭니다. 온라인 상태로 인덱스를 다시 작성하거나 인덱스 다시 작성 작업 중에 병렬 처리 수준을 제어하려면 ALTER INDEX REBUILD 문에 ONLINE 옵션을 사용합니다.

 

... 아래는 해당 데이터베이스의 모든 테이블의 인덱스를 재정리하는 작업이다. 공간은 80% 기준으로 하였다.

 

 

USE 데이터베이스명

 

DECLARE @TableName varchar(255)

 

DECLARE TableCursor CURSOR FOR

SELECT table_name FROM information_schema.tables

WHERE table_type = 'base table'

 

OPEN TableCursor

 

FETCH NEXT FROM TableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0

BEGIN

DBCC DBREINDEX(@TableName,' ',90)

FETCH NEXT FROM TableCursor INTO @TableName

END

 

CLOSE TableCursor

 

DEALLOCATE TableCursor

 

 

 

 

보통 특정 테이블 마이그래이션 이후, 아래와 같이 하루에 1번 정도 설정해 주면 성능이 좋을 겁니다.

 

 

--인덱스 조각모음. - table 인덱스 다시 잡음  
 DBCC dbreindex (DP_BOA_LIST)  
  
 --테이블 통계 업데이트  
 UPDATE STATISTICS DP_BOA_LIST  
  
 --처리후 다시 조각화 조회  
 DBCC showcontig (DP_BOA_LIST)

 



 

TAGS.

Comments 0