메모리 액세스에 최적화된 테이블을 포함한 시스템 버전 임시 테이블System-Versioned Temporal Tables with Memory-Optimized Tables

이 항목은 다음에 적용됩니다. 예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

메모리 액세스에 최적화된 테이블 에 대한 시스템 버전 임시 테이블은 메모리 내 OLTP 작업으로 수집한 데이터 위에 데이터 감사 및 특정 시간 분석 이 필요한 시나리오에 대해 비용 효율적인 솔루션을 제공하기 위한 것입니다.System-versioned temporal tables for Memory-Optimized Tables are designed to provide cost-effective solution for scenarios where data audit and point in time analysis are required on top of data collected with In-Memory OLTP workloads. 이는 높은 트랜잭션 처리량, 잠금 없는 동시성 및 동시에 쉽게 쿼리할 수 있는 대량의 기록 데이터를 저장하는 기능을 제공합니다.They provide high transactional throughput, lock-free concurrency and at the same time, ability to store large amount of history data that can be easily queried.

개요Overview

시스템 버전 임시 테이블은 자동으로 데이터 변경 내용에 대한 전체 기록을 유지하며 특정 시간 분석에 대해 편리한 TRANSACT-SQL 확장을 적용합니다.System-versioned temporal tables automatically keep a full history of data changes and expose convenient Transact-SQL extensions for point in time analysis. 일반적인 시나리오에서는 데이터 기록이 정기적으로 쿼리되지 않더라도 매우 긴 시간(여러 달, 심지어 수 년) 동안 보존됩니다.In a typical scenario, data history is retained for a very long period of time (multiple months, even years), even though it is not regularly queried.

데이터 감사 및 시간 기반 분석은 서로 다른 환경, 특히 매우 많은 수의 요청을 처리하는 OLTP 시스템에서, 그리고 메모리 내 OLTP 기술을 사용하는 경우에 필요할 수 있습니다.Data audit and time-based analysis can be demanded in different environments, especially in OLTP systems that process extremely large numbers of requests and where In-Memory OLTP technology is used. 그러나 메모리 액세스에 최적화된 테이블을 임시 시나리오에 사용하는 것은 일반적으로 막대한 양의 기록 데이터가 생성되어 사용 가능 RAM 메모리의 한계를 초과하기 때문에 어려울 수 있습니다.However, using memory-optimized tables in temporal scenarios is challenging because a huge amount of generated historical data commonly exceeds the limit of available RAM memory. 동시에 자주 액세스하지 않아서 오래된 읽기 전용 기록 데이터를 RAM에 저장하는 것은 최적의 솔루션이 아닙니다.At the same time using RAM to store read-only historical data that is accessed less frequently as it becomes older is not an optimal solution.

메모리 액세스에 최적화된 테이블에 대한 시스템 버전 관리 임시 테이블은 높은 트랜잭션 처리량, 잠금 없는 동시성 및 동시에 현재 데이터(임시 테이블)에 메모리 내 테이블을 사용하고 기록 데이터에 디스크 기반 테이블을 사용하여 대량의 기록 데이터를 저장하는 기능을 제공합니다.System-versioned temporal tables for memory-optimzed tables provide high transactional throughput, lock-free concurrency and at the same time, ability to store large amount of history data by using in-memory tables for storing current data (the temporal table) and disk-based tables for historical data. DML 작업에 미치는 영향은 최근 기록을 저장하고 고유하게 컴파일된 코드에서 DML을 실행할 수 있도록 하는 내부의 자동 생성된 메모리 액세스에 최적화된 문자열 테이블을 사용하면 최소화됩니다.The impact on DML operations is minimalized through the use of an internal, auto-generated memory-optimized staging table that stores recent history and enables DMLs to be executed from natively compiled code.

다음 다이어그램은 이 아키텍처를 보여 줍니다.임시 메모리 내 아키텍처The following diagram illustrates this architecture.Temporal In-Memory Architecture

구현 정보Implementation Details

메모리 액세스에 최적화된 테이블을 포함한 시스템 버전 관리 임시 테이블에 관한 다음 사실은 시스템 버전 관리 메모리 액세스에 최적화된 테이블을 만들 때 주의해야 하는 고려사항입니다.The following facts about system-versioned temporal tables with memory optimized tables are considerations of which you need to be aware when creating a system-versioned memory-optimized table. 구문 옵션 및 예제는 CREATE TABLE(Transact-SQL)을 참조하세요.For syntax options and for an example, see CREATE TABLE (Transact-SQL).

  • 내구성 있는 메모리 액세스에 최적화된 테이블만이 시스템 버전 관리가 가능합니다(DURABILITY = SCHEMA_AND_DATA).Only durable memory-optimized tables can be system-versioned (DURABILITY = SCHEMA_AND_DATA).

  • 메모리 액세스에 최적화된 시스템 버전 관리 테이블에 대한 기록 테이블은 만든 주체가 최종 사용자이든 또는 시스템이든 상관없이 디스크 기반이어야 합니다.History table for memory-optimized system-versioned table must be disk-based, regardless if it was created by the end user or the system.

  • 현재 테이블(메모리 내)에만 영향을 주는 쿼리를 고유하게 컴파일된 T-SQL 모듈에서 사용할 수 있습니다.Queries that affect only the current table (in-memory) can be used in natively compiled T-SQL modules. FOR SYSTEM TIME 절을 사용하는 임시 쿼리는 고유하게 컴파일된 모듈에서 지원되지 않습니다.Temporal queries using the FOR SYSTEM TIME clause are not supported in natively compiled modules. 임시 쿼리 및 비네이티브 모듈에서 메모리 액세스에 최적화된 테이블이 포함된 FOR SYSTEM TIME 절을 사용할 수 있습니다.Use of the FOR SYSTEM TIME clause with memory-optimized tables in ad hoc queries and non-native modules is supported.

  • SYSTEM_VERSIONING = ON의 경우, 메모리 액세스에 최적화된 현재 테이블에 대한 업데이트 및 삭제 연산의 결과인 최근 시스템 버전 관리 변경 내용을 수용하기 위해 메모리 액세스에 최적화된 준비 테이블이 자동으로 생성됩니다.When SYSTEM_VERSIONING = ON, an internal memory-optimized staging table is automatically created to accept the most recent system-versioned changes that are results of update and delete operations on memory-optimized current table.

  • 내부 메모리 액세스에 최적화된 준비 테이블의 데이터는 비동기 데이터 플러시 태스크에 의해 정기적으로 디스크 기반 기록 테이블로 이동됩니다.Data from the internal memory-optimized staging table is regularly moved to the disk-based history table by the asynchronous data flush task. 이 데이터 플러시 메커니즘의 목표는 내부 메모리 버퍼를 상위 개체의 메모리 소비량의 10% 미만으로 유지하는 것입니다.This data flush mechanism has a goal to keep the internal memory buffers at less than 10% of the memory consumption of their parent objects. sys.dm_db_xtp_memory_consumers(Transact-SQL)를 쿼리하고 메모리 액세스에 최적화된 준비 테이블 및 현재 임시 테이블에 대한 데이터를 요약하면 메모리 액세스에 최적화된 시스템 버전 관리 임시 테이블의 총 메모리 소비량을 추적할 수 있습니다.You can track the total memory consumption of memory-optimized system-versioned temporal table by querying sys.dm_db_xtp_memory_consumers (Transact-SQL) and summarizing the data for the internal memory-optimized staging table and the current temporal table.

  • sp_xtp_flush_temporal_history를 호출하면 데이터 플러시를 적용할 수 있습니다.You can enforce a data flush by invoking sp_xtp_flush_temporal_history.

  • SYSTEM_VERSIONING = OFF 의 경우 또는 시스템 버전 관리 테이블의 스키마가 열 추가, 삭제 또는 변경에 의해 수정된 경우 내부 준비 버퍼의 전체 내용이 디스크 기반 기록 테이블로 이동됩니다.When SYSTEM_VERSIONING = OFF or when schema of system-versioned table is modified by adding, dropping or altering columns, the entire contents of the internal staging buffer is moved into the disk-based history table.

  • 기록 데이터 쿼리는 결과적으로 스냅숏 격리 수준 아래에 있으며 언제나 메모리 내 준비 버퍼와 디스크 기반 테이블 사이의 합집합을 중복 없이 반환합니다.Querying of historical data is effectively under SNAPSHOT isolation level and always returns a union between in-memory staging buffer and disk based table without duplicates.

  • 내부적으로 테이블 스키마를 변경하는ALTER TABLE 작업은 작업 기간이 오래 걸릴 수 있는 데이터 플래시를 수행해야 합니다.ALTER TABLE operations that change the table schema internally must perform a data flush, which may prolong the duration of the operation.

내부 메모리 액세스에 최적화된 준비 테이블The Internal Memory-Optimized Staging Table

내부 메모리 액세스에 최적화된 준비 테이블은 DML 작업을 최적화하기 위해 시스템에 의해 생성된 내부 개체입니다.The internal memory-optimized staging table is an internal object that is created by the system to optimize DML operations.

  • 테이블 이름은 Memory_Optimized_History_Table_<object_id> 형식으로 생성됩니다. 여기서 <object_id>는 현재 임시 테이블의 ID입니다.The table name is generated in the following format: Memory_Optimized_History_Table_<object_id> where <object_id> is identifier of the current temporal table.

  • 테이블은 현재 임시 테이블에 BIGINT 열 한 개를 더한 스키마를 복제합니다.The table replicates the schema of current temporal table plus one BIGINT column. 이 추가 열은 내부 기록 버퍼로 이동되는 행의 고유성을 보장합니다.This additional column guarantees the uniqueness of the rows moved to internal history buffer.

  • 추가 열 이름의 형식은 Change_ID[_< suffix>]입니다. 여기서 _<suffix>는 테이블에 Change_ID 열이 이미 있는 경우에 선택적으로 추가됩니다.The additional column has the following name format: Change_ID[_< suffix>], where _<suffix> is optionally added in the case where the table already has a Change_ID column.

  • 시스템 버전 관리 메모리 액세스에 최적화된 테이블에 대한 최대 행 크기는 준비 테이블의 추가 BIGINT 열 때문에 8 바이트만큼 감소합니다.The maximum row size for a system-versioned memory-optimized table is reduced by 8 bytes because of the additional BIGINT column in staging table. 새 최대값은 이제 8052 바이트입니다.The new maximum is now 8052 bytes.

  • 내부 메모리 액세스에 최적화된 준비 테이블은 SQL Server Management Studio의 개체 탐색기에 표시되지 않습니다.The internal memory-optimized staging table is not represented in Object Explorer of SQL Server Management Studio.

  • 이 테이블에 관한 메타데이터뿐만 아니라 현재 임시 테이블과의 연결도 sys.internal_tables(Transact-SQL)에서 찾을 수 있습니다.Metadata about this table as well as its connection with current temporal table can be found in sys.internal_tables (Transact-SQL).

데이터 플러시 작업The Data Flush Task

데이터 플러시는 메모리 액세스에 최적화된 테이블이 메모리 크기 기반 데이터 이동 조건을 만족하는지 여부를 검사하는 정기적으로 활성화되는 태스크입니다.The data flush is a regularly activated task that checks whether any memory-optimized table meets a memory size-based condition for data movement. 데이터 이동은 내부 준비 테이블의 메모리 소비량이 현재 임시 테이블의 메모리 소비량의 8%에 도달할 때 시작됩니다.Data movement starts when memory consumption of internal staging table reaches 8% of memory consumption of current temporal table.

데이터 플러시 작업은 기존 작업을 기반으로 변화하는 일정을 사용하여 정기적으로 활성화됩니다.The data flush task is activated regularly with a schedule that varies based on the existing workload. 매 5초마다 자주 수행되는 많은 작업 및 매 1분마다 가끔 수행되는 적은 작업의 경우.With a heavy workload, as frequent as every 5 seconds, and with a light workload, as infrequent as every 1 minute. 정리가 필요한 각 내부 메모리 액세스에 최적화된 준비 테이블에 대해 스레드 한 개가 생성됩니다.One thread is spawned for each internal memory-optimized staging table that needs cleanup.

데이터 플러시는 현재 실행 중인 가장 오래된 트랜잭션보다 더 오래된 메모리 내 내부 버퍼의 모든 레코드를 삭제하여 이러한 레코드를 디스크 기반 기록 테이블로 이동합니다.Data flush deletes all records from in-memory internal buffer that are older than the oldest currently running transaction to move these records to the disk-based history table.

sp_xtp_flush_temporal_history 를 호출하고 스키마 및 테이블 이름You can enforce a data flush by invoking sp_xtp_flush_temporal_history and specifying the schema and table name:
sys.sp_xtp_flush_temporal_history @schema_name, @object_namesys.sp_xtp_flush_temporal_history @schema_name, @object_name. 이 사용자 실행 명령을 사용하면 내부 일정에 따라 시스템에 의해 데이터 플러시 태스크를 호출할 때와 같은 데이터 이동 프로세스가 호출됩니다.With this user-executed command, the same data movement process is invoked as when data flush task is invoked by the system on internal schedule.

이 문서가 도움이 되었나요?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 Usage Scenarios
임시 테이블 시스템 일관성 검사 Temporal Table System Consistency Checks
임시 테이블을 사용하여 분할 Partitioning with Temporal Tables
임시 테이블 고려 사항 및 제한 사항 Temporal Table Considerations and Limitations
임시 테이블 보안 Temporal Table Security
시스템 버전 관리된 임시 테이블에서 기록 데이터의 보존 관리 Manage Retention of Historical Data in System-Versioned Temporal Tables
임시 테이블 메타데이터 뷰 및 함수 Temporal Table Metadata Views and Functions