다음을 통해 공유


일반 테이블에서 원장 테이블로 데이터 마이그레이션

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

일반 테이블을 원장 테이블로 변환할 수는 없지만 기존 일반 테이블에서 원장 테이블로 데이터를 마이그레이션한 다음, 원래 테이블을 원장 테이블로 바꿀 수 있습니다.

데이터베이스 원장 확인을 수행하는 경우 프로세스는 각 트랜잭션 내의 모든 작업을 주문해야 합니다. SELECT INTO 또는 BULK INSERT 문을 사용하여 일반 테이블에서 원장 테이블로 수십억 개의 행을 복사하는 경우 모두 단일 트랜잭션에서 수행됩니다. 즉, 많은 데이터를 완전히 정렬해야 하며 이러한 정렬은 단일 스레드에서 수행됩니다. 정렬 작업은 완료하는 데 시간이 오래 걸립니다.

일반 테이블을 원장 테이블로 변환하려면 sys.sp_copy_data_in_batches 저장 프로시저를 사용하는 것이 좋습니다. 이렇게 하면 트랜잭션당 1만~10만 행의 일괄 처리로 복사 작업이 분할됩니다. 결과적으로 데이터베이스 원장 확인은 병렬로 정렬할 수 있는 더 작은 트랜잭션을 갖게 됩니다. 이렇게 하면 데이터베이스 원장 확인 시간에 큰 도움이 됩니다.

참고 항목

고객은 다른 명령, 서비스 또는 도구를 사용하여 원본 테이블에서 대상 테이블로 데이터를 복사할 수 있습니다. 큰 트랜잭션은 데이터베이스 원장 확인에서 성능상의 영향을 미치므로 이를 피해야 합니다.

이 문서에서는 일반 테이블을 원장 테이블로 변환하는 방법을 보여줍니다.

필수 조건

추가 전용 또는 업데이트 가능한 원장 테이블 만들기

sys.sp_copy_data_in_batches 저장 프로시저를 사용하려면 원본 테이블과 동일한 스키마를 사용하여 추가 전용 원장 테이블 또는 업데이트 가능한 원장 테이블을 만들어야 합니다. 스키마는 열 수, 열 이름 및 해당 데이터 형식 측면에서 동일해야 합니다. TRANSACTION ID, SEQUENCE NUMBERGENERATED ALWAYS 열은 시스템에 의해 생성되므로 무시됩니다. 테이블 간의 인덱스는 다를 수 있지만 대상 테이블은 힙 테이블이거나 클러스터형 인덱스만 가질 수 있습니다. 비클러스터형 인덱스는 나중에 만들어야 합니다.

데이터베이스에 다음과 같은 일반 Employees 테이블이 있다고 가정합니다.

CREATE TABLE [dbo].[Employees](
	[EmployeeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
	[SSN] [char](11) NOT NULL,
	[FirstName] [nvarchar](50) NOT NULL,
	[LastName] [nvarchar](50) NOT NULL,
	[Salary] [money] NOT NULL
	);

추가 전용 원장 테이블 또는 업데이트 가능한 원장 테이블을 만드는 가장 쉬운 방법은 원래 테이블을 스크립팅하고 LEDGER = ON 절을 추가하는 것입니다. 아래 스크립트에서는 Employees 테이블의 스키마를 기반으로 Employees_LedgerTable이라는 이름의 업그레이드 가능한 새 원장 테이블을 만들고 있습니다.

	CREATE TABLE [dbo].[Employees_LedgerTable](
	[EmployeeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
	[SSN] [char](11) NOT NULL,
	[FirstName] [nvarchar](50) NOT NULL,
	[LastName] [nvarchar](50) NOT NULL,
	[Salary] [money] NOT NULL
	)
    WITH 
    (
      SYSTEM_VERSIONING = ON,
      LEDGER = ON
    ); 

일반 테이블에서 원장 테이블로 데이터 복사

저장 프로시저 sys.sp_copy_data_in_batches는 스키마가 동일한지 확인한 후 원본 테이블에서 대상 테이블로 데이터를 복사합니다. 데이터는 개별 트랜잭션에서 일괄 처리로 복사됩니다. 작업이 실패하면 대상 테이블이 부분적으로 채워집니다. 대상 테이블도 비어 있어야 합니다.

아래 스크립트에서는 일반 Employees 테이블에서 업데이트 가능한 새 원장 테이블 Employees_LedgerTable로 데이터를 복사합니다.

sp_copy_data_in_batches @source_table_name = N'Employees' , @target_table_name = N'Employees_LedgerTable'