임시 테이블 고려 사항 및 제한 사항Temporal Table Considerations and Limitations

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

시스템 버전 관리의 특성으로 인해 임시 테이블을 사용하는 경우 고려해야 할 몇 가지 고려 사항 및 제한 사항이 있습니다.There are some considerations and limitations to be aware of when working with temporal tables, due to the nature of system-versioning.

임시 테이블 관련 작업을 수행할 때는 다음 사항을 고려해야 합니다.Consider the following when working with temporal tables.

  • 임시 테이블에는 기본 키가 정의되어야 현재 테이블과 기록 테이블 사이에서 레코드를 연결할 수 있고 기록 테이블에는 기본 키를 정의할 수 없습니다.A temporal table must have a primary key defined in order to correlate records between the current table and the history table, and the history table cannot have a primary key defined.

  • SYSTEM_TIME 기간 열은 SysStartTime 을 기록하기 위해 사용되고 SysEndTime 값은 datetime2 데이터 형식으로 정의되어야 합니다.The SYSTEM_TIME period columns used to record the SysStartTime and SysEndTime values must be defined with a datatype of datetime2.

  • 기록 테이블 생성 도중 기록 테이블의 이름을 지정하는 경우 스키마와 테이블 이름을 지정해야 합니다.If the name of a history table is specified during history table creation, you must specify the schema and table name.

  • 기본적으로 기록 테이블은 PAGE (으)로 압축됩니다.By default, the history table is PAGE compressed.

  • 구성 분할은 현재 테이블에서 기록 테이블로 자동 복제를 수행하지 않기 때문에 현재 테이블이 분할된 경우 기록 테이블은 기본 파일 그룹에 생성됩니다.If current table is partitioned, the history table is created on default file group because partitioning configuration is not replicated automatically from the current table to the history table.

  • 임시 및 기록 테이블은 FILETABLE 이 될 수 없고 FILESTREAM 을 제외한 지원되는 모든 데이터 형식의 열을 포함할 수 있습니다. 그 이유는 FILETABLEFILESTREAMSQL ServerSQL Server 외부에서의 데이터 조작을 허용하여 시스템 버전 관리가 보장되지 않기 때문입니다.Temporal and history tables cannot be FILETABLE and can contain columns of any supported datatype other than FILESTREAM since FILETABLE and FILESTREAM allow data manipulation outside of SQL ServerSQL Server and thus system versioning cannot be guaranteed.

  • (n)varchar(max), varbinary(max), (n)textimage등의 임시 테이블은 BLOB 데이터 형식을 지원하는 반면 크기로 인해 상당한 저장소 비용이 부과되고 성능이 저하됩니다.While temporal tables support blob data types, such as (n)varchar(max), varbinary(max), (n)text, and image, they will incur significant storage costs and have performance implications due to their size. 따라서 이러한 데이터 유형을 사용하는 경우 시스템 설계 시 유의해야 합니다.As such, when designing your system, care should be taken when using these data types.

  • 기록 테이블은 현재 테이블과 동일한 데이터베이스에 만들어야 합니다.History table must be created in the same database as the current table. Linked Server 에서의 임시 쿼리는 지원되지 않습니다.Temporal querying over Linked Server is not supported.

  • 기록 테이블은 제약 조건(기본 키, 외래 키, 테이블 또는 열 제약 조건)을 가질 수 없습니다.History table cannot have constraints (primary key, foreign key, table or column constraints).

  • 인덱싱된 뷰는 임시 쿼리를 기반으로 사용할 수 없습니다( FOR SYSTEM_TIME 절을 사용하는 쿼리).Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause)

  • 시스템 버전 관리 임시 테이블에서는 Online 옵션 (WITH (ONLINE = ON)이 ALTER TABLE ALTER COLUMN 에 영향을 주지 않습니다.Online option (WITH (ONLINE = ON) has no effect on ALTER TABLE ALTER COLUMN in case of system-versioned temporal table. ONLINE 옵션에 지정된 값과 관계없이 열 변경은 온라인으로 수행되지 않습니다.ALTER column is not performed as online regardless of which value was specified for ONLINE option.

  • INSERTUPDATE 문은 SYSTEM_TIME 기간 열을 참조할 수 없습니다.INSERT and UPDATE statements cannot reference the SYSTEM_TIME period columns. 이러한 열에 직접 값을 삽입하려는 시도는 차단됩니다.Attempts to insert values directly into these columns will be blocked.


  • 기록 테이블의 데이터를 직접 수정하는 것은 허용되지 않습니다.Direct modification of the data in a history table is not permitted.

  • ON DELETE CASCADEON UPDATE CASCADE 은 현재 테이블에서 허용되지 않습니다.ON DELETE CASCADE and ON UPDATE CASCADE are not permitted on the current table. 즉, 임시 테이블이 외래 키 관계(sys.foreign_keys의 parent_object_id 에 해당)인 경우 CASCADE 옵션은 허용되지 않습니다.In other words, when temporal table is referencing table in the foreign key relationship (corresponding to parent_object_id in sys.foreign_keys) CASCADE options are not allowed. 이러한 제약 조건으로 작업하려면 응용 프로그램 논리를 사용하거나 트리거 후에 기본 키 테이블(sys.foreign_keys의 referenced_object_id 에 해당)에서 삭제 시 일관성을 유지하세요.To work around this limitation, use application logic or after triggers to maintain consistency on delete in primary key table (corresponding to referenced_object_id in sys.foreign_keys). 기본 키 테이블이 임시이고 참조 테이블이 비임시인 경우 그러한 제한 사항이 없습니다.If primary key table is temporal and referencing table is non-temporal, there’s no such limitation.

    참고: 이 제한 사항은 SQL Server 2016에만 적용됩니다.NOTE: This limitation applies to SQL Server 2016 only. CASCADE 옵션은 SQL 데이터베이스SQL Database 및 SQL Server 2017 CTP 2.0 이상에서 지원됩니다.CASCADE options are supported in SQL 데이터베이스SQL Database and SQL Server 2017 starting from CTP 2.0.

  • DML 논리 무효화를 방지하기 위해INSTEAD OF 트리거가 현재 또는 기록 테이블에서 허용되지 않습니다.INSTEAD OF triggers are not permitted on either the current or the history table to avoid invalidating the DML logic. AFTER 트리거는 현재 테이블에서만 허용됩니다.AFTER triggers are permitted only on the current table. DML 논리 무효화를 방지하기 위해 기록 테이블에서 차단됩니다.They are blocked on the history table to avoid invalidating the DML logic.

  • 복제 기술은 제한적으로 사용됩니다.Usage of replication technologies is limited.

    • 항상 사용 가능: 모두 지원Always On: Fully supported

    • 변경 데이터 캡처 및 변경 데이터 추적: 현재 테이블에서만 지원Change Data Capture and Change Data Tracking: Supported only on the current table

    • 스냅숏 및 트랜잭션 복제: 임시로 활성화되지 않은 단일 게시자 및 임시로 활성화된 한 구독자에서만 지원됩니다.Snapshot and transactional replication: Only supported for a single publisher without temporal being enabled and one subscriber with temporal enabled. 이 경우, 게시자는 OLTP 작업에서 사용되고 구독자는 오프로딩 보고서(‘AS OF’ 쿼리 포함)에서 사용됩니다.In this case, the publisher is used for an OLTP workload while subscriber serves for offloading reporting (including ‘AS OF’ querying).
      각 구독자가 로컬 시스템 시계에 의존하여 임시 데이터가 일치하지 않을 수 있으므로 다중 구독자를 사용할 수 없습니다.Use of multiple subscribers is not supported since this scenario may lead to inconsistent temporal data as each of them would depend on the local system clock.

    • 병합 복제: 임시 테이블에서 지원되지 않습니다.Merge replication: Not supported for temporal tables

  • 일반 쿼리는 현재 테이블의 데이터에만 영향을 줍니다.Regular queries only affect data in the current table. 기록 테이블에서 데이터를 쿼리하려면 임시 쿼리를 사용해야 합니다.To query data in the history table, you must use temporal queries. 이것에 대한 설명은 이 문서의 임시 데이터 쿼리 섹션에서 차후에 설명됩니다.These are discussed later in this document in the section entitled Querying Temporal Data.

  • 최적의 인덱싱 전략은 현재 테이블에 클러스터형 열 저장소 인덱스 및/또는 B-트리 rowstore 인덱스를 포함하고 기록 테이블에 클러스터형 columnstore 인덱스를 포함하여 최적의 저장소 크기와 성능을 획득하는 것입니다.An optimal indexing strategy will include a clustered columns store index and / or a B-tree rowstore index on the current table and a clustered columnstore index on the history table for optimal storage size and performance. 자체 기록 테이블을 생성/사용하는 경우 기간 열의 마지막에서 시작하는 기간 열로 구성되는 유형의 인덱스를 만들어 임시 쿼리 속도를 향상시키고 데이터 일관성 확인의 일부인 쿼리의 속도를 향상시키는 것이 좋습니다.If you create / use your own history table, we strongly recommend that you create this type of index consisting of period columns starting with the end of period column to speed up temporal querying as well as speeding up the queries that are part of the data consistency check. 기본 기록 테이블은 기간 열(끝, 시작)을 기반으로 생성된 클러스터형 rowstore 인덱스를 가질 수 있습니다.The default history table has a clustered rowstore index created for you based on the period columns (end, start). 최소한 비클러스터형 rowstore 인덱스를 사용하는 것이 좋습니다.At a minimum, a non-clustered rowstore index is recommended.

  • 기록 테이블을 만들 때 다음 개체/속성은 현재 테이블에서 기록 테이블로 복제되지 않습니다.The following objects/properties are not replicated from the current to the history table when the history table is created

    • 기간 정의Period definition

    • ID 정의Identity definition

    • 인덱스Indexes

    • 통계Statistics

    • CHECK 제약 조건Check constraints

    • 트리거Triggers

    • 분할 구성Partitioning configuration

    • 사용 권한Permissions

    • 행 수준 보안 조건자Row-level security predicates

  • 일련의 기록 테이블에서 기록 테이블은 현재 테이블로 구성될 수 있습니다.A history table cannot be configured as current table in a chain of history tables.

이 문서가 도움이 되었나요?Did this Article Help You? 여러분의 의견을 환영합니다.We’re Listening

어떤 정보를 찾고 계세요? 정보를 찾으셨나요?What information are you looking for, and did you find it? 여러분의 의견은 문서의 내용을 개선하는 데 많은 도움이 됩니다.We’re listening to your feedback to improve the content. 의견이 있으면 sqlfeedback@microsoft.comPlease submit your comments to sqlfeedback@microsoft.com

참고 항목See Also

임시 테이블 Temporal Tables
시스템 버전 관리 임시 테이블 시작 Getting Started with System-Versioned Temporal Tables
임시 테이블 시스템 일관성 검사 Temporal Table System Consistency Checks
임시 테이블을 사용하여 분할 Partitioning with Temporal Tables
임시 테이블 보안 Temporal Table Security
시스템 버전 관리된 임시 테이블에서 기록 데이터의 보존 관리 Manage Retention of Historical Data in System-Versioned Temporal Tables
메모리 액세스에 최적화된 테이블을 포함한 시스템 버전 임시 테이블 System-Versioned Temporal Tables with Memory-Optimized Tables
임시 테이블 메타데이터 뷰 및 함수Temporal Table Metadata Views and Functions