temporal 테이블 고려 사항 및 제한 사항

적용 대상: SQL Server 2016(13.x) 이상 Azure SQL 데이터베이스 Azure SQL Managed Instance

시스템 버전 관리의 특성으로 인해 temporal 테이블을 사용하는 경우 고려해야 할 몇 가지 고려 사항 및 제한 사항이 있습니다.

  • 현재 테이블과 기록 테이블 간의 레코드를 연관시키기 위해 temporal 테이블에는 기본 키가 정의되어 있어야 합니다. 기록 테이블에는 기본 키를 정의할 수 없습니다.

  • SYSTEM_TIME 기간 열은 ValidFrom 기록을 위해 사용되고 ValidTo 값은 datetime2 데이터 형식으로 정의되어야 합니다.

  • temporal 구문은 데이터베이스에 로컬로 저장된 테이블 또는 뷰에서 작동합니다. 연결된 서버 또는 외부 테이블의 테이블과 같은 원격 개체를 사용하면 쿼리에서 직접 FOR 절 또는 마침표 조건자를 사용할 수 없습니다.

  • 기록 테이블 생성 도중 기록 테이블의 이름을 지정하는 경우 스키마와 테이블 이름을 지정해야 합니다.

  • 기본적으로 기록 테이블은 PAGE로 압축됩니다.

  • 구성 분할은 현재 테이블에서 기록 테이블로 자동 복제를 수행하지 않기 때문에 현재 테이블이 분할된 경우 기록 테이블은 기본 파일 그룹에 생성됩니다.

  • temporal 및 기록 테이블은 FileTable 또는 FILESTREAM을 사용할 수 없습니다. FileTable 및 FILESTREAM은 SQL Server 외부에서의 데이터 조작을 허용하므로 시스템 버전 관리를 보장할 수 없습니다.

  • 노드 또는 에지 테이블을 temporal 테이블로 만들거나 변경할 수 없습니다.

  • (n)varchar(max), varbinary(max), (n)textimage등의 temporal 테이블은 BLOB 데이터 형식을 지원하는 반면 크기로 인해 상당한 스토리지 비용이 부과되고 성능이 저하됩니다. 따라서 이러한 데이터 유형을 사용하는 경우 시스템 설계 시 유의해야 합니다.

  • 기록 테이블은 현재 테이블과 동일한 데이터베이스에 만들어야 합니다. Linked Server에서의 temporal 쿼리는 지원되지 않습니다.

  • 기록 테이블은 제약 조건(기본 키, 외래 키, 테이블 또는 열 제약 조건)을 가질 수 없습니다.

  • 인덱싱된 뷰는 temporal 쿼리를 기반으로 사용할 수 없습니다( FOR SYSTEM_TIME 절을 사용하는 쿼리).

  • 시스템 버전 관리 temporal 테이블에서는 온라인 옵션(WITH (ONLINE = ON)이 ALTER TABLE ALTER COLUMN에 영향을 주지 않습니다. ONLINE 옵션에 지정된 값과 관계없이 ALTER 열은 온라인 작업으로 수행되지 않습니다.

  • INSERTUPDATE 문은 SYSTEM_TIME 기간 열을 참조할 수 없습니다. 이러한 열에 직접 값을 삽입하려는 시도는 차단됩니다.

  • SYSTEM_VERSIONINGON인 동안 TRUNCATE TABLE은 지원되지 않습니다.

  • 기록 테이블의 데이터를 직접 수정하는 것은 허용되지 않습니다.

  • ON DELETE CASCADEON UPDATE CASCADE은 현재 테이블에서 허용되지 않습니다. 즉, temporal 테이블이 외래 키 관계(sys.foreign_keyparent_object_id에 해당)인 경우 CASCADE 옵션은 허용되지 않습니다. 이러한 제약 조건으로 작업하려면 애플리케이션 논리를 사용하거나 트리거 후에 기본 키 테이블(sys.foreign_keyreferenced_object_id에 해당)에서 삭제 시 일관성을 유지하세요. 기본 키 테이블이 temporal이고 참조 테이블이 비temporal 테이블인 경우 그러한 제한 사항이 없습니다.
  • DML 논리 무효화를 방지하기 위해 INSTEAD OF 트리거가 현재 또는 기록 테이블에서 허용되지 않습니다. AFTER 트리거는 현재 테이블에서만 허용됩니다. 이러한 트리거는 DML 논리 무효화를 방지하기 위해 기록 테이블에서 차단됩니다.

  • 복제 기술은 다음과 같이 제한적으로 사용됩니다.

    • 가용성 그룹: 완전히 지원됨

    • 변경 데이터 캡처 및 변경 내용 추적: 현재 테이블에서만 지원

    • 스냅샷 및 트랜잭션 복제: temporal을 사용하지 않은 단일 게시자 및 temporal을 사용한 한 명의 구독자에 대해서만 지원됩니다. 로컬 시스템 클록에 대한 종속성으로 인해 여러 구독자를 사용하는 것은 지원되지 않으며, 이로 인해 일관되지 않은 temporal 데이터가 발생할 수 있습니다. 이 경우 게시자는 OLTP 작업에서 사용되고 구독자는 오프로딩 보고서(AS OF 쿼리 포함)에서 사용됩니다. 배포 에이전트가 시작되면 배포 에이전트가 중지될 때까지 열린 상태로 유지되는 트랜잭션이 열립니다. ValidFromValidTo는 배포 에이전트가 시작되는 첫 번째 트랜잭션의 시작 시간으로 채워집니다. 따라서 애플리케이션 또는 조직에 중요한 최신 시스템 시간에 가까운 시간으로 ValidFromValidTo를 채운 경우 배포 에이전트를 지속적으로 실행하는 기본 동작이 아닌 일정에 따라 실행하는 것이 더 좋을 수 있습니다. 자세한 내용은 temporal 테이블 사용 시나리오를 참조하세요.

    • 병합 복제: temporal 테이블에서 지원되지 않습니다.

  • 일반 쿼리는 현재 테이블의 데이터에만 영향을 줍니다. 기록 테이블에서 데이터를 쿼리하려면 temporal 쿼리를 사용해야 합니다. 자세한 내용은 시스템 버전 관리 temporal 테이블의 데이터 쿼리를 참조하세요.

  • 최적의 인덱싱 전략은 현재 테이블에 클러스터형 열 스토리지 인덱스 및/또는 B-트리 rowstore 인덱스를 포함하고 기록 테이블에 클러스터형 columnstore 인덱스를 포함하여 최적의 스토리지 크기와 성능을 획득하는 것입니다. 자체 기록 테이블을 생성/사용하는 경우 기간 종료 열로 시작하는 기간 열로 구성된 이러한 유형의 인덱스를 만드는 것이 좋습니다. 이 인덱스는 temporal 쿼리 속도를 향상시키고 데이터 일관성 검사의 일부인 쿼리 속도를 향상합니다. 기본 기록 테이블은 기간 열(끝, 시작)을 기반으로 생성된 클러스터형 rowstore 인덱스를 가질 수 있습니다. 최소한 비클러스터형 rowstore 인덱스를 사용하는 것이 좋습니다.

  • 기록 테이블을 만들 때 다음 개체/속성은 현재 테이블에서 기록 테이블로 복제되지 않습니다.

    • 기간 정의
    • ID 정의
    • 인덱스
    • 통계
    • CHECK 제약 조건
    • 트리거
    • 분할 구성
    • 사용 권한
    • 행 수준 보안 조건자
  • 일련의 기록 테이블에서 기록 테이블은 현재 테이블로 구성될 수 있습니다.

참고 항목

설명서는 인덱스를 지칭할 때 B-트리라는 용어를 사용합니다. rowstore 인덱스에서 데이터베이스 엔진은 B+ 트리를 구현합니다. 이는 columnstore 인덱스나 메모리 최적화 테이블 인덱스에는 적용되지 않습니다. 자세한 내용은 SQL Server 및 Azure SQL 인덱스 아키텍처 및 디자인 가이드를 참조하세요.