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)text 및 image등의 temporal 테이블은 BLOB 데이터 형식을 지원하는 반면 크기로 인해 상당한 스토리지 비용이 부과되고 성능이 저하됩니다. 따라서 이러한 데이터 유형을 사용하는 경우 시스템 설계 시 유의해야 합니다.
기록 테이블은 현재 테이블과 동일한 데이터베이스에 만들어야 합니다. Linked Server에서의 temporal 쿼리는 지원되지 않습니다.
기록 테이블은 제약 조건(기본 키, 외래 키, 테이블 또는 열 제약 조건)을 가질 수 없습니다.
인덱싱된 뷰는 temporal 쿼리를 기반으로 사용할 수 없습니다(
FOR SYSTEM_TIME
절을 사용하는 쿼리).시스템 버전 관리 temporal 테이블에서는 온라인 옵션(
WITH (ONLINE = ON
)이ALTER TABLE ALTER COLUMN
에 영향을 주지 않습니다.ONLINE
옵션에 지정된 값과 관계없이ALTER
열은 온라인 작업으로 수행되지 않습니다.INSERT
및UPDATE
문은SYSTEM_TIME
기간 열을 참조할 수 없습니다. 이러한 열에 직접 값을 삽입하려는 시도는 차단됩니다.SYSTEM_VERSIONING
가ON
인 동안TRUNCATE TABLE
은 지원되지 않습니다.기록 테이블의 데이터를 직접 수정하는 것은 허용되지 않습니다.
ON DELETE CASCADE
및ON UPDATE CASCADE
은 현재 테이블에서 허용되지 않습니다. 즉, temporal 테이블이 외래 키 관계(sys.foreign_key
의parent_object_id
에 해당)인 경우CASCADE
옵션은 허용되지 않습니다. 이러한 제약 조건으로 작업하려면 애플리케이션 논리를 사용하거나 트리거 후에 기본 키 테이블(sys.foreign_key
의referenced_object_id
에 해당)에서 삭제 시 일관성을 유지하세요. 기본 키 테이블이 temporal이고 참조 테이블이 비temporal 테이블인 경우 그러한 제한 사항이 없습니다.
DML 논리 무효화를 방지하기 위해
INSTEAD OF
트리거가 현재 또는 기록 테이블에서 허용되지 않습니다.AFTER
트리거는 현재 테이블에서만 허용됩니다. 이러한 트리거는 DML 논리 무효화를 방지하기 위해 기록 테이블에서 차단됩니다.복제 기술은 다음과 같이 제한적으로 사용됩니다.
가용성 그룹: 완전히 지원됨
변경 데이터 캡처 및 변경 내용 추적: 현재 테이블에서만 지원
스냅샷 및 트랜잭션 복제: temporal을 사용하지 않은 단일 게시자 및 temporal을 사용한 한 명의 구독자에 대해서만 지원됩니다. 로컬 시스템 클록에 대한 종속성으로 인해 여러 구독자를 사용하는 것은 지원되지 않으며, 이로 인해 일관되지 않은 temporal 데이터가 발생할 수 있습니다. 이 경우 게시자는 OLTP 작업에서 사용되고 구독자는 오프로딩 보고서(
AS OF
쿼리 포함)에서 사용됩니다. 배포 에이전트가 시작되면 배포 에이전트가 중지될 때까지 열린 상태로 유지되는 트랜잭션이 열립니다.ValidFrom
및ValidTo
는 배포 에이전트가 시작되는 첫 번째 트랜잭션의 시작 시간으로 채워집니다. 따라서 애플리케이션 또는 조직에 중요한 최신 시스템 시간에 가까운 시간으로ValidFrom
및ValidTo
를 채운 경우 배포 에이전트를 지속적으로 실행하는 기본 동작이 아닌 일정에 따라 실행하는 것이 더 좋을 수 있습니다. 자세한 내용은 temporal 테이블 사용 시나리오를 참조하세요.병합 복제: temporal 테이블에서 지원되지 않습니다.
일반 쿼리는 현재 테이블의 데이터에만 영향을 줍니다. 기록 테이블에서 데이터를 쿼리하려면 temporal 쿼리를 사용해야 합니다. 자세한 내용은 시스템 버전 관리 temporal 테이블의 데이터 쿼리를 참조하세요.
최적의 인덱싱 전략은 현재 테이블에 클러스터형 열 스토리지 인덱스 및/또는 B-트리 rowstore 인덱스를 포함하고 기록 테이블에 클러스터형 columnstore 인덱스를 포함하여 최적의 스토리지 크기와 성능을 획득하는 것입니다. 자체 기록 테이블을 생성/사용하는 경우 기간 종료 열로 시작하는 기간 열로 구성된 이러한 유형의 인덱스를 만드는 것이 좋습니다. 이 인덱스는 temporal 쿼리 속도를 향상시키고 데이터 일관성 검사의 일부인 쿼리 속도를 향상합니다. 기본 기록 테이블은 기간 열(끝, 시작)을 기반으로 생성된 클러스터형 rowstore 인덱스를 가질 수 있습니다. 최소한 비클러스터형 rowstore 인덱스를 사용하는 것이 좋습니다.
기록 테이블을 만들 때 다음 개체/속성은 현재 테이블에서 기록 테이블로 복제되지 않습니다.
- 기간 정의
- ID 정의
- 인덱스
- 통계
- CHECK 제약 조건
- 트리거
- 분할 구성
- 사용 권한
- 행 수준 보안 조건자
일련의 기록 테이블에서 기록 테이블은 현재 테이블로 구성될 수 있습니다.
참고 항목
설명서는 인덱스를 지칭할 때 B-트리라는 용어를 사용합니다. rowstore 인덱스에서 데이터베이스 엔진은 B+ 트리를 구현합니다. 이는 columnstore 인덱스나 메모리 최적화 테이블 인덱스에는 적용되지 않습니다. 자세한 내용은 SQL Server 및 Azure SQL 인덱스 아키텍처 및 디자인 가이드를 참조하세요.