데이터베이스 유지 관리(SQL Server Compact)

Microsoft SQL Server Compact 데이터베이스의 내부 구조는 시간이 지남에 따라 조각화되어 불필요한 디스크 공간이 발생하게 됩니다. 조각화가 너무 많으면 성능이 저하될 수 있습니다. 조각화를 방지하려면 다음 기능을 사용하여 SQL Server Compact 데이터베이스를 유지 관리하십시오.

이 항목에서 설명하는 메서드 및 속성을 사용하는 방법은 System.Data.SqlServerCe를 참조하십시오.

압축

Compact 메서드(네이티브 프로그래밍의 CompactDatabase 메서드)를 사용하여 데이터베이스 파일의 공간을 회수합니다. 이 메서드를 사용하여 암호 및 LCID(로캘 ID) 같은 데이터베이스 설정을 변경할 수도 있습니다.

SQL Server Compact 데이터베이스 파일은 페이지라는 4KB의 논리 단위로 구분됩니다. 데이터베이스를 계속 수정하면 일부 페이지에 사용되지 않은 공간이 포함될 수 있으며 일부 페이지는 사용되지 않습니다. 결국 사용되지 않은 페이지는 AutoShrink 메커니즘에 의해 지워집니다. 자세한 내용은 이 항목의 뒷부분에 나오는 "자동 축소" 섹션을 참조하십시오.

페이지의 빈 공간은 Compact 메서드로만 지울 수 있습니다. Compact 메서드는 원본 데이터베이스의 행을 읽고 대상 데이터베이스에 해당 행을 기록하기 때문에 대상 데이터베이스의 불필요한 공간이 최소화됩니다.

참고

대상 데이터베이스에 대해 Data Source 속성을 지정하지 않으면 Compact 메서드는 압축된 새 데이터베이스로 원본 데이터베이스를 덮어쓰고 같은 이름을 사용합니다.

데이터베이스를 압축하는 경우

  • 새 데이터베이스가 다시 만들어지고 새 인덱스가 만들어집니다.

  • 인접한 데이터베이스 페이지에 상주하도록 테이블 페이지가 다시 구성됩니다. 따라서 데이터베이스 간 테이블 조각화가 줄어 공간 할당이 향상됩니다.

  • 모든 데이터베이스 데이터를 새 데이터 페이지에 다시 기록하면 개체 및 레코드 삭제로 만들어진 사용되지 않은 공간이 지워집니다. 데이터베이스에서 개체나 레코드를 삭제하면 개체나 레코드에서 사용 중인 공간은 데이터베이스에 새로 추가할 수 있는 것으로 표시됩니다. 데이터의 전체 페이지를 삭제하지 않는 한 페이지는 부분적으로 채워진 상태로 유지됩니다. 데이터베이스는 페이지에서 최종 데이터를 삭제하거나 데이터베이스를 압축해야 축소됩니다. 개체와 레코드의 추가, 삭제 및 업데이트가 빈번한 데이터베이스의 경우에는 압축을 자주 수행하는 것이 좋습니다.

  • 할당된 다음 값이 나머지 레코드에서 가장 큰 값보다 한 단계 큰 값이 되도록 ID 열 증가값이 다시 설정됩니다. 예를 들어 데이터베이스의 모든 레코드를 삭제한 경우 데이터베이스를 압축하면 다음 레코드의 ID 열 값은 초기값으로 설정됩니다. 데이터베이스에 남은 가장 큰 ID 값이 50이고 단계 값이 5인 경우 데이터베이스를 압축하면 다음 레코드의 값이 55로 설정됩니다. 이는 50보다 큰 값이 포함된 레코드를 이전에 추가했지만 압축하기 전에 삭제한 경우에도 적용됩니다. 단계 값은 -5처럼 음수가 될 수도 있으며 최소값은 15입니다. 데이터베이스를 압축하면 다음 레코드의 값이 10으로 설정됩니다.

    참고

    이러한 동작은 Visual Studio 2008의 원래 릴리스 버전을 사용할 경우 발생합니다. 데이터베이스를 압축하더라도 Visual Studio 2008 SP1.의 ID 정보는 변경되지 않습니다.

  • 대상 데이터베이스 연결 문자열의 로캘 ID 또는 암호에 대해 값을 지정하면 대상 데이터베이스를 만들 때 해당 값이 사용됩니다.

데이터베이스를 압축하려면 다음 조건이 충족되는지 확인하십시오.

  • 데이터베이스는 닫혀 있어야 합니다.

  • Compact 메서드를 호출할 때 대상 데이터베이스가 없어야 합니다. DestConnection에서 지정한 데이터베이스가 이미 있거나 이름이 같은 다른 파일이 이미 있으면 오류가 발생합니다.

  • 임시 데이터베이스에 저장된 데이터와 캐시된 데이터뿐만 아니라 데이터베이스의 원래 버전 및 압축된 버전 모두에 대한 저장소 공간이 충분해야 합니다.

중요

Compact 메서드를 사용하려면 장치의 사용 가능한 공간이 원본 데이터베이스 크기의 두 배 이상이어야 합니다.

자동 축소

데이터베이스를 압축하려면 새 데이터베이스를 만든 다음 원본 데이터베이스의 모든 개체를 새 데이터베이스로 복사합니다. 일반적으로 압축은 자동으로 시작되지 않습니다. 데이터베이스 파일의 크기를 자동으로 조정하는 기능을 AutoShrink라고 합니다. 이 기술은 프로세서 시간과 메모리를 거의 사용하지 않으므로 핸드헬드 장치 및 모바일 데이터베이스 제품에 특히 적합합니다. Autoshrink 기술은 파일 내에서 페이지를 이동하여 빈 페이지나 할당되지 않은 페이지가 모두 파일의 끝에 인접하게 배치되도록 합니다. 그런 다음 빈 페이지가 잘립니다. 잘린 페이지는 데이터베이스 파일 시스템에서 사용할 수 있습니다. 잘린 페이지를 데이터베이스 파일 시스템으로 되돌리면 파일 시스템 공간이 늘어납니다.

관리 코드의 경우 Autoshrink를 설정하려면 AutoShrink Threshold 연결 문자열 속성을 사용하십시오. 네이티브 코드의 경우 DBPROP_SSCE_AUTO_SHRINK_THRESHOLD 속성을 사용하십시오. 이러한 속성은 Autoshrink가 시작되기 전에 파일에서 사용 가능한 공간의 비율을 지정합니다.

참고

Shrink 메서드를 호출하여 데이터베이스를 축소할 수도 있습니다. 자세한 내용은 System.Data.SqlServerCe를 참조하십시오.

확인

SQL Server Compact 데이터베이스 파일은 페이지라는 4KB의 논리 단위로 구분됩니다. 각 페이지가 데이터베이스 파일에 기록될 때 SQL Server Compact는 해당 페이지에 대한 체크섬을 계산하고 저장합니다. 페이지가 파일에 기록된 다음 수정되거나 손상되면 예상 체크섬과 일치하지 않게 됩니다. SQL Server Compact에서 이 페이지를 읽으면 SSCE_M_DATABASECORRUPTED(25017) 원시 오류를 반환합니다.

SqlCeEngine 클래스의 Verify 메서드를 호출하면 데이터베이스 파일의 모든 페이지에 대한 체크섬을 다시 계산하고 체크섬이 예상 값과 일치하는지 확인합니다. 이 메서드가 true를 반환하면 데이터베이스 파일이 손상되지 않은 것입니다. 이 메서드가 false를 반환하면 데이터베이스 파일이 손상되었으므로 응용 프로그램에서 Repair 메서드를 호출해야 합니다.

복구

데이터베이스 파일이 손상되면 SqlCeEngine 개체의 Repair(System.String,System.Data.SqlServerCe.RepairOption) 메서드나 네이티브 Engine 개체 프로그래밍(SQL Server Compact)의 Repair 메서드를 사용하여 데이터베이스 파일을 복구하려고 할 수 있습니다. Repair 메서드는 데이터베이스를 분석하여 페이지 체크섬을 계산합니다. 현재 체크섬이 이전에 페이지가 데이터베이스에 기록될 때 계산된 체크섬과 일치하지 않으면 해당 페이지가 손상된 것으로 간주됩니다. 4개의 RepairOptions를 사용할 수 있습니다. 이 옵션의 사용 방법에 대한 자세한 정보는 방법: 데이터베이스 확인 및 복구(프로그래밍 방식)를 참조하십시오.

참고

Repair 메서드는 SQL Server Compact에서 SSCE_M_DATABASECORRUPTED(25017) 원시 오류를 반환하거나 SqlCeEngine 개체의 Verify 메서드 호출 시 false를 반환하는 경우에만 유용합니다.

자동 플러시

트랜잭션으로 인해 데이터베이스가 변경되면 이러한 변경 내용은 트랜잭션이 커밋되거나 중단될 때까지 버퍼 풀에 유지됩니다. 트랜잭션이 중단되면 변경 내용이 삭제됩니다. 트랜잭션이 커밋되면 변경 내용은 다른 사용자 및 트랜잭션에 표시되지만 데이터베이스에 바로 기록되지는 않습니다. 장치 리셋처럼 프로그램이 비정상적으로 종료되는 경우 커밋되었지만 변경 내용이 데이터베이스에 기록되지 않은 트랜잭션은 삭제됩니다.

트랜잭션은 항상 커밋된 순서대로 데이터베이스에 기록됩니다. 즉, 일부 트랜잭션은 손실될 수 있지만 데이터베이스는 항상 일관되게 유지됩니다. 예를 들어 응용 프로그램에서 트랜잭션 A를 커밋한 다음 트랜잭션 B를 커밋했다고 가정해 보십시오. 응용 프로그램이 충돌하거나 장치가 리셋되는 경우 데이터베이스는 다음 세 가지 상태 중 하나가 될 수 있습니다.

  • 변경되지 않음

  • 트랜잭션 A에 의해 변경됨

  • A와 B 둘 모두에 의해 변경됨

트랜잭션이 커밋된 순서대로 데이터베이스에 기록하면 데이터베이스 파일 기록 횟수가 줄어 성능이 향상됩니다. 단기간에 커밋된 소규모 트랜잭션이 많은 경우에는 특히 현저하게 성능이 향상됩니다. 이런 경우 각 트랜잭션에서 별도의 데이터베이스 쓰기 작업을 발생시키지 않고 모든 트랜잭션을 데이터베이스 파일에 동시에 기록합니다.

버퍼 풀에 있는 보류 중인 변경 내용은 ADO .NET의 Flush Interval 연결 문자열 속성(OLE DB의 DPROP_SSCE_FLUSH_INTERVAL 속성)으로 지정한 간격에 따라 데이터베이스에 기록되거나 플러시됩니다. 이러한 속성은 커밋된 트랜잭션이 디스크로 플러시되기 전까지의 최대 시간(초)을 설정합니다.

참고

커밋될 때 데이터베이스에 보관해야 하는 트랜잭션에 대해 응용 프로그램은 CommitMode 열거형 또는 OLE DB의 DBPROP_SSCE_TRANSACTION_COMMIT_MODE 속성을 사용하여 커밋 시 기본 플러시 동작을 재정의합니다. 응용 프로그램은 이러한 속성을 사용하여 데이터베이스에서 발생한 모든 트랜잭션이 유지되도록 할 수 있습니다.

백업/복원/삭제

SQL Server Compact에서는 파일 기반 데이터베이스 시스템이므로 파일 시스템 API를 사용하여 데이터베이스 백업, 복원 및 삭제와 같은 여러 일반적인 데이터베이스 태스크를 수행할 수 있습니다.

  • 데이터베이스를 백업하려면 데이터베이스에 대한 모든 연결을 닫은 다음 .sdf 파일을 복사합니다.

  • 데이터베이스를 삭제하려면 .sdf 데이터베이스 파일을 삭제합니다.

참고 항목

참조

CompactDatabase 메서드(SQL Server Compact)

Repair 메서드(SQL Server Compact)