파티션 전환을 사용하여 데이터를 효율적으로 전송

데이터를 분할하면 데이터 하위 집합을 빠르고 효율적으로 관리 및 액세스하는 동시에 전체 데이터 컬렉션의 무결성을 유지할 수 있습니다. Transact-SQL ALTER TABLE...SWITCH 문을 사용하여 다음과 같은 방법으로 데이터 하위 집합을 신속하고 효율적으로 전송할 수 있습니다.

  • 테이블을 이미 분할된 기존 테이블에 파티션으로 할당

  • 분할된 한 테이블에서 다른 테이블로 파티션 전환

  • 파티션을 다시 할당하여 단일 테이블 구성

파티션 전환 개념 및 파티션 전환을 구현하는 예제 코드는 Readme_SlidingWindow를 참조하십시오.

파티션 전환을 위한 일반 요구 사항

파티션이 전송될 때 데이터가 물리적으로 이동되지는 않으며 데이터의 위치에 대한 메타데이터만 변경됩니다. 파티션을 전환하려면 먼저 여러 가지 일반적인 요구 사항을 충족해야 합니다.

  • SWITCH 작업 전에 두 테이블이 존재해야 합니다.. 전환 작업을 수행하기 전에 파티션이 이동되는 원본 테이블과 파티션을 받는 대상 테이블 모두 데이터베이스에 있어야 합니다.

  • 받는 파티션이 존재하되 비어 있어야 합니다. 테이블을 이미 분할된 기존 테이블에 파티션으로 추가하든 분할된 한 테이블에서 다른 테이블로 파티션을 이동하는 경우든 관계없이 새 파티션을 받는 파티션이 존재해야 하며 이는 비어 있는 파티션이어야 합니다.

  • 분할되지 않은 받는 테이블이 존재하되 비어 있어야 합니다. 파티션을 다시 할당하여 분할되지 않은 단일 테이블을 구성하는 경우 새 파티션을 받는 테이블이 존재해야 하며, 이는 비어 있고 분할되지 않은 테이블이어야 합니다.

  • 파티션은 동일한 열에 있어야 합니다. 분할된 한 테이블에서 다른 테이블로 파티션을 전환하는 경우 두 테이블 모두 같은 열에서 분할되어 있어야 합니다.

  • 원본 및 대상 테이블은 동일한 파일 그룹을 공유해야 합니다. ALTER TABLE...SWITCH 문의 원본과 대상은 같은 파일 그룹에 있어야 하며 원본과 대상의 큰 값 열도 같은 파일 그룹에 저장되어 있어야 합니다. 또한 해당하는 모든 인덱스나 인덱싱된 뷰 파티션도 같은 파일 그룹에 있어야 합니다. 하지만 파일 그룹은 해당 테이블이나 해당하는 다른 인덱스의 파일 그룹과 다를 수 있습니다.

인덱싱된 뷰가 정의된 경우의 파티션 전환에 대한 자세한 내용은 인덱싱된 뷰가 정의된 경우 파티션 전환을 참조하십시오.

테이블 및 인덱스 구조 요구 사항

상기된 일반적인 요구 사항 외에 원본 테이블과 대상 테이블은 동일한 구조를 가져야 합니다. 구조 요구 사항은 다음과 같습니다.

  • 원본 및 대상 테이블은 동일한 열 구조 및 순서를 가져야 합니다. 원본 및 대상 테이블에는 동일한 이름으로 된 같은 열이 있어야 하고 데이터 형식, 길이, 데이터 정렬, 전체 자릿수, 소수 자릿수, Null 허용 여부, 기본 키 제약 조건(있는 경우) 등이 같아야 하며 ANSI_NULLS 및 QUOTED IDENTIFIER에 대한 설정도 같아야 합니다. 또한 열이 같은 순서로 정의되어 있어야 합니다. IDENTITY 속성은 고려되지 않습니다.

    주의 사항주의

    파티션 전환을 수행하면 대상 테이블의 IDENTITY 열에 중복 값이 들어 오고 원본 테이블의 IDENTITY 열 값에 간격이 생길 수 있습니다. DBCC CHECKIDENT를 사용하여 테이블의 ID 값을 확인하고 원하는 경우 값을 수정할 수 있습니다.

  • 분할 열의 Null 허용 여부는 서로 일치해야 합니다. 원본 및 대상 테이블은 NULL이거나 NOT NULL이어야 합니다. 테이블 중 하나가 분할되지 않은 경우 다른 테이블의 분할 열에 해당하는 열의 Null 허용 여부는 분할된 테이블의 열과 일치해야 합니다.

    중요 정보중요

    분할된 테이블의 분할 열에는 NOT NULL을 지정하는 것이 좋습니다. 또한 ALTER TABLE...SWITCH 작업의 원본 또는 대상인 분할되지 않은 테이블에도 NOT NULL을 지정하는 것이 좋습니다. 분할된 열이 NOT NULL이면 분할 열의 CHECK 제약 조건에서 Null 값을 확인하지 않아도 됩니다. Null 값은 일반적으로 분할된 테이블의 가장 왼쪽 파티션에 배치됩니다. 가장 왼쪽 파티션이 아닌 파티션을 전환 중이며 ANSI_NULLS 데이터베이스 옵션이 ON으로 설정된 경우 원본 및 대상 테이블에 NOT NULL 제약 조건이 없으면 분할 열에 정의된 CHECK 제약 조건을 방해할 수 있습니다.

  • 계산 열의 구문이 같아야 합니다. 해당하는 분할 키가 계산 열인 경우 계산 열을 정의하는 식의 구문은 같으며 계산 열이 둘 다 유지됩니다.

  • ROWGUID 속성이 같아야 합니다. ROWGUID 속성으로 정의된 모든 열은 다른 테이블에서 ROWGUID 속성으로 정의된 열과 일치해야 합니다.

  • XML 열의 스키마가 동일해야 합니다. 모든 xml 열은 동일한 XML 스키마 컬렉션 유형이어야 합니다.

  • text, ntext 또는 image 열의 행 내부 설정이 같아야 합니다. 이 설정에 대한 자세한 내용은행 내부 데이터를 참조하십시오.

  • 테이블에는 동일한 클러스터형 인덱스가 있어야 합니다.. 원본 및 대상 테이블에는 동일한 클러스터형 인덱스가 있어야 하며 인덱스는 파티션을 전환하기 전에 비활성화할 수 없습니다.

  • 비클러스터형 인덱스는 정의되어야 하며 동일해야 합니다. 대상 테이블에 정의된 모든 비클러스터형 인덱스는 원본 테이블에도 정의되고 각 인덱스 키 열에 대해 고유성, 하위 키 및 정렬 방향(ASC 또는 DESC)이 동일하게 구성됩니다. 비활성화된 비클러스터형 인덱스는 이 요구 사항에서 제외됩니다.

제약 조건 요구 사항

파티션을 이동하려면 다음 추가 제약 조건 요구 사항도 만족해야 합니다.

  • CHECK 제약 조건은 원본 및 대상에 정확히 일치하거나 둘 모두에 적용 가능해야 합니다. 대상 테이블에 정의된 모든 CHECK 제약 조건은 원본 테이블에도 정확히 일치하도록 정의되거나 대상 테이블의 CHECK 제약 조건이 적용되도록(예: 하위 집합으로) 정의되어야 합니다.

  • int 열의 제약 조건은 동일하거나 하위 집합이어야 합니다. 원본 테이블의 int 열에 대한 CHECK 제약 조건은 대상 테이블의 int 열에 대한 제약 조건과 일치하거나 하위 집합으로 존재해야 합니다. 예를 들어 대상 테이블의 int 열인 Column1에 Column1 < 100을 지정하는 제약 조건이 있는 경우 원본 테이블의 해당 열인 Column1은 동일한 제약 조건을 갖거나 원본 테이블의 Column1 < 90과 같이 대상 테이블의 값에 대해 배치된 제약 조건의 하위 집합이어야 합니다. 여러 열을 지정하는 CHECK 제약 조건은 동일한 구문을 사용하여 정의되어야 합니다.

  • 분할되지 않은 테이블은 대상 파티션과 동일한 제약 조건을 가져야 합니다. 분할되지 않은 테이블을 이미 분할된 기존 테이블에 파티션으로 추가하는 경우 대상 테이블의 파티션 키에 해당하는 원본 테이블의 열에 제약 조건이 정의되어 있어야 합니다. 그 결과 값의 범위는 대상 파티션의 경계 값 내에 포함됩니다.

  • 원본 파티션의 경계 값은 대상 파티션의 경계 내에 있어야 합니다. 분할된 테이블의 파티션을 분할된 다른 파티션으로 전환하는 경우 원본 파티션의 경계 값은 대상 파티션의 경계 값 내에 포함되어야 합니다. 경계 값이 맞지 않으면 원본 테이블의 모든 데이터가 대상 파티션의 경계 값 안에 있도록 원본 테이블의 파티션 키에 제약 조건이 정의되어야 합니다.

    주의 사항주의

    제약 조건 정의에서 데이터 형식을 변환하지 마십시오. 파티션을 전환하는 원본 테이블에 정의되어 있는 암시적 또는 명시적 데이터 형식 변환을 포함한 제약 조건이 있는 경우 ALTER TABLE...SWITCH는 실패할 수 있습니다.

  • 원본 및 대상 테이블은 동일한 FOREIGN KEY 제약 조건을 가져야 합니다. 대상 테이블에 FOREIGN KEY 제약 조건이 있으면 원본 테이블의 해당 열에는 동일한 외래 키가 정의되어 있어야 하고 이러한 외래 키는 대상 테이블과 동일한 기본 키를 참조해야 합니다. 원본 테이블의 외래 키는 대상 테이블의 해당 외래 키도 is_not_trusted로 표시되지 않는 한 is_not_trusted로 표시될 수 없습니다. 이러한 표시 여부는 sys.foreign_keys 카탈로그 뷰에서 확인할 수 있습니다. 이 설정에 대한 자세한 내용은 인덱스 비활성화에 대한 지침를 참조하십시오. SQL Server는 대상 테이블의 외래 키에 정의된 모든 CASCADE 규칙을 새로 이동된 파티션에 적용합니다.

파티션 이동을 위한 추가 요구 사항

파티션을 이동하려면 다음 추가 요구 사항도 만족해야 합니다.

  • 인덱스는 테이블 파티션과 정렬되어야 합니다. 원본 테이블의 모든 인덱스는 원본 테이블과 정렬되어야 하며 대상 테이블의 모든 인덱스는 대상 테이블과 정렬되어야 합니다. 원본 테이블과 대상 테이블은 모두 분할 또는 분할되지 않거나 둘 중 하나만 분할될 수 있습니다. 인덱스 정렬에 대한 자세한 내용은 분할 인덱스에 대한 특수 지침을 참조하십시오.

  • 인덱싱된 뷰가 있는 원본 테이블에는 추가 제약 조건 및 요구 사항이 적용됩니다. ALTER TABLE … SWITCH 문의 대상 테이블에 정의된 인덱싱된 뷰가 있는 경우 인덱싱된 뷰가 정의된 경우 파티션 전환에서 제약 조건 및 예를 참조하십시오.

  • 전체 텍스트 인덱스는 허용되지 않습니다. 원본 테이블이나 대상 테이블에 전체 텍스트 인덱스가 있을 수 없습니다.

  • 대상 테이블에는 XML 인덱스가 허용되지 않습니다. 대상 테이블에는 XML 인덱스가 있을 수 없습니다.

  • 원본 테이블에 기본 키가 있는 경우 기본 키/외래 키가 정의되지 않습니다. 원본 테이블이 기본 키를 보유하는 경우 원본 테이블과 대상 테이블 사이에 활성 기본 키/외래 키 관계가 있을 수 없습니다.

  • 대상 테이블에 외래 키가 있는 경우 기본 키/외래 키가 정의되지 않습니다. 대상 테이블이 외래 키를 보유하는 경우 원본 테이블과 대상 테이블 사이에 활성 기본 키/외래 키 관계가 있을 수 없습니다.

  • 다른 테이블의 외래 키는 원본 테이블을 참조할 수 없습니다. 원본 테이블은 다른 테이블의 외래 키에 의해 참조될 수 없습니다.

  • 원본 또는 대상 테이블에는 규칙이 허용되지 않습니다. 원본 테이블이나 대상 테이블에 규칙을 정의할 수 없습니다. CHECK 제약 조건은 원본 및 대상 테이블에서 사용될 수 있습니다.

    [!참고]

    규칙은 이전 버전과의 호환성을 위한 기능입니다. 기본 설정 구현은 CHECK 제약 조건을 사용하는 것입니다. CHECK 제약 조건의 제한 사항은 이 항목의 앞에 나오는 제약 조건 요구 사항을 참조하십시오.

  • 원본 및 대상 테이블은 복제될 수 없습니다. 원본 테이블과 대상 테이블 모두 복제 원본이 될 수 없습니다.

  • 파티션 전환 전에 필요한 데이터베이스 권한이 있어야 합니다. 파티션 전환은 ALTER TABLE 문을 사용하므로 ALTER TABLE 문과 연관된 필요한 데이터베이스 권한이 있어야 합니다. 원본 테이블과 대상 테이블의 권한 집합은 같을 필요가 없습니다.

  • 파티션을 이동하는 중에는 트리거를 활성화할 수 없습니다. INSERT, UPDATE 또는 DELETE 트리거 또는 연계 동작은 테이블 파티션 이동으로 활성화되지 않으며 파티션을 이동하기 위해 원본 테이블이나 대상 테이블에서 트리거를 비슷하게 정의할 필요는 없습니다.

    [!참고]

    ALTER TABLE…SWITCH 작업 중에는 원본 테이블과 대상 테이블 모두에 대해 스키마 수정 잠금이 설정되어 변경하는 동안 다른 연결에서 테이블을 참조하지 못하게 됩니다. 잠금에 대한 자세한 내용은 잠금 모드를 참조하십시오.

테이블 파티션을 이동하려면