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


9

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

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

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

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

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

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

편집하다:

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


3
테이블이 실제로 파일 그룹 이외의 파일 그룹으로 끝나는 경우 (또는 응용 프로그램)주의를 기울 PRIMARY입니까?
Jon Seigel

@ JonSeigel 나는 템플릿 데이터베이스를 만들고 모든 데이터를 이동 해야하는 번거 로움을 덜어주기 때문에 실제로는 좋은 생각이라고 생각합니다.
db2

직접 코딩 한 솔루션 만 고려하고 있습니까? 아니면 일부 응용 프로그램을 검토하여 도움을받을 수 있습니까? RedGate의 SQL Storage Compress 를 사용하여 라이브 데이터를 압축 할 수 있습니다 . 또는 가상 복원 을 시도 하여 압축 된 백업을 온라인 DB로 사용할 수있게 만들 수 있습니다 (실제로 필요한 전체 공간이없는 상태). 그것들은 모두 라이브 데이터와 백업을 압축하는 데 아주 좋은 오래된 Hyperbac Windows 파일 드라이버를 기반으로합니다.
Marian

@Marian 흥미롭게 들리지만 지금은 기본 SQL Server 기능을 고수하고 싶습니다. 파일에 남아있는 사용되지 않은 공간이 많지 않고 데이터베이스를 매우 효과적으로 조각 모음해야합니다. 수동으로 스크립팅하는 대신 작업을 수행하는 타사 도구라면 괜찮습니다.
db2

생각 만해도 새로운 파일 그룹을 만들고, 파일을 추가하고, 적당한 크기 (500MB)를 설정 한 다음 새 파일 그룹에 테이블을 다시 빌드하면 안됩니다. 그런 다음 기본 파일을 거의 줄이지 마십시오. 시스템 테이블의 조각화에 대해서는 신경 쓰지 않아도됩니다.
Nic

답변:


1

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

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

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

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


불행히도 대부분 텍스트와 이미지를 사용합니다. 타사 응용 프로그램이므로 변경할 수 없습니다.
db2

SQL 서버가 <8k이면 행에 정보를 저장하여 응용 프로그램에 실제로 투명합니다. 공급 업체가 지원하지 않는다고 말하면 원래 SQL Server 2005에서 더 이상 사용되지 않는 데이터 유형을 왜 사용하고 있는지 묻습니다.
DamagedGoods

응용 프로그램이 데이터 유형을 변경 한 후 실패 할 WRITETEXT와 같은 텍스트 / 이미지 관련 작업을 수행하지 않는다는 것을 완전히 확신 할 수는 없습니다. 그러나 요점으로 돌아가서 클러스터형 인덱스를 다시 만들면 LOB 데이터가 실제로 이동하지 않습니다.
db2

이 작업을 수행 할 수는 있지만 GUI에서 디자이너로 이동 한 다음 속성을 확장 한 다음 '일반적인 데이터 공간'과 TEXTIMAGE 파일 그룹을 사용하여이를 변경하지만 테이블을 다시 생성해야합니다. 분명히 스크립트를 작성하고 가능한 경우 유지 관리 창에서 실행할 수 있습니다
DamagedGoods

적어도 적절한 재 구축 스크립트를 생성하는 유용한 방법 일 수 있습니다.
db2

0

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


이 경우 파일 스트림이 제대로 확장되지 않을 것으로 생각됩니다. 우리는 17 개의 데이터베이스에서 1400 만 개 이상의 행을 확보했으며 매일 약 15,000 개의 메시지를 받고 있습니다. 메시지 본문의 상당 부분이 4KB 미만이므로 NTFS 클러스터 낭비가 심각 할 수 있습니다 (블록 크기가 64KB보다 작은 새 디스크 볼륨을 추가하더라도 마찬가지 임).
db2

이 경우 데이터 유형을 nvarchar (max)와 같은 것으로 변환하고 TEXTIMAGE_ON 절을 사용하여 이러한 큰 객체에 다른 파일 그룹을 지정할 수 있습니까? 이를 통해 데이터를 행 외부에 저장하고 아카이브를 관리하기위한 고유 한 프로세스를 작성할 수 있습니다.
Liam Confrey 2013

파일 스트림 사용은 실제로 각 LOBS의 크기에 따라 다릅니다. 레코드 당> 1MB가 고려되어야한다고 생각합니다. 그래서 나는이 경우에 옵션이 아니라는 것에 동의합니다
DamagedGoods
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.