보관 목적으로 데이터베이스 조각 모음 / 압축을 수행하는 가장 좋은 방법 : DBCC SHRINKFILE

이메일 아카이빙에 사용되는 SQL Server 인스턴스가 있습니다 (타사 아카이빙 패키지 제공). 소프트웨어는 빈 데이터베이스로 롤오버됩니다. 우리는 과거에이 분기를 수행했지만 지금은 매월 수행하려고합니다. 아카이브되는 데이터의 양은 한 달에 약 15-20GB이며 대부분의 데이터는 소수의 테이블 (보통 2-4)에만 있습니다.

새 데이터베이스로 롤오버하면 이전 데이터베이스는 읽기 전용으로 사용됩니다. 내가하고 싶은 것은 모든 테이블 / 인덱스가 인접하고 매우 높은 채우기 비율을 가지며 데이터 파일 끝에 빈 공간이 많지 않은 훌륭하고 단단한 데이터 파일로 최적화하는 것입니다. 또한이 서버에서 Standard Edition을 사용하고 있으며 모든 제한이 있습니다 (그렇지 않으면 데이터 압축을 이미 사용하고 있음).

내가 생각할 수있는 몇 가지 가능성 :

  1. DBCC SHRINKFILE 인덱스를 재 구축 / 재구성합니다. (이는 DBCC SHRINKFILE이 닿는 모든 것에서 오줌을 조각 내지 만 완전성을 위해 포함시키기 때문에 합리적인 옵션은 아닙니다.)
  2. 자동 통계를 끈 상태에서 새 데이터베이스를 만듭니다. 소스 데이터베이스에서 모든 테이블을 스크립트하고 다시 작성하십시오. bcp를 사용하여 클러스터 키 순서로 새 데이터베이스로 데이터를 내보내거나 가져옵니다. 모든 인덱스를 스크립팅하고 다시 작성하십시오. 전체 스캔으로 모든 통계를 다시 계산하십시오.
  3. 자동 통계를 끈 상태에서 새 데이터베이스를 만듭니다. 소스 데이터베이스에서 모든 테이블을 스크립트하고 다시 작성하십시오. SSIS 또는 T-SQL을 사용하여 데이터를 새 데이터베이스로 전송하십시오. 모든 인덱스를 스크립팅하고 다시 작성하십시오. 전체 스캔으로 모든 통계를 다시 계산하십시오.

모든 경우의 마지막 단계는 데이터베이스를 읽기 전용 모드로 설정하는 것입니다.

다른 좋은 / 더 나은 옵션이 있습니까? 내 관심사는 높은 채우기 비율을 유지하고 논리적으로 연속적인 방식으로 데이터를 옮기는 것입니다.

편집하다:

데이터의 약 75 %가 이미지 (LOB) 열에 저장되어있는 것 같습니다.



답변

파일에서 물리적 조각화를 제거하기 위해 클러스터 된 인덱스를 기존 파일을 새 파일 그룹으로 옮길 수 있습니다. RO가 되려면 삽입에 필요한 공간이 없어서 모든 채우기 비율을 100 %로 만듭니다. 업데이트로 인한 페이지 분할.

또한 엔터프라이즈로 이동하기로 결정한 경우 부분 복원을 수행하고 데이터베이스를 매우 빠르게 온라인 상태로 만들 수 있습니다. Enterprise는 또한 필렛 인이 읽기 전용 데이터에 대한 쿼리 시간을 크게 줄이면서 열 저장소 인덱스를 허용합니다.

조각화 관련 심각한 문제없이 읽기 전용으로 전환하기 전에 shrinkfile 옵션을 한 번 사용하여 원하는대로 파일 끝의 공간을 제거 할 수 있습니다.

참고로 LOBS에 최신 데이터 유형을 사용하고 있는지 확인하십시오. 즉, ntext 또는 text 대신 nvarchar (max) 또는 varchar (max), 이미지 대신 varbinary (max)?


답변

구조화되지 않은 데이터를 저장하기 위해 이미지 데이터 유형을 사용하는 타사 도구와 비슷한 문제에 직면했으며 filestream 을 사용하도록 열을 변환하여 해결했습니다 . 앱이 여전히 예상대로 작동하는지 확인하기 위해 몇 가지 테스트를 수행해야하지만,이를 통해 효율적인 방식으로 데이터를 아카이브 데이터베이스로 이동시키는 자체 아카이브 프로세스를 작성할 수 있습니다.