Condividi tramite


Eseguire la migrazione di dati da tabelle normali a tabelle del libro mastro

Si applica a: SQL Server 2022 (16.x) Database Azure SQL Istanza gestita di SQL di Azure

La conversione di tabelle normali in tabelle del libro mastro non è possibile, ma è possibile eseguire la migrazione dei dati da una tabella normale esistente a una tabella del libro mastro e quindi sostituire la tabella originale con quella del libro mastro.

Quando si esegue una verifica del libro mastro del database, il processo deve ordinare tutte le operazioni all'interno di ogni transazione. Se si usa un'istruzione SELECT INTO o BULK INSERT per copiare alcuni miliardi di righe da una tabella normale a una tabelladel libro mastro, verrà eseguita in un'unica transazione. Ciò significa che è necessario ordinare completamente molti dati, che verranno eseguiti in un single threading. Questa operazione potrebbe richiedere molto tempo.

Per convertire una tabella normale in una tabella del libro mastro, Microsoft consiglia di usare la stored procedure sys.sp_copy_data_in_batches. Questo suddivide l'operazione di copia in batch di 10-100mila righe per transazione. Di conseguenza, la verifica del libro mastro del database ha transazioni più piccole che possono essere ordinate in parallelo. Questo influisce moltissimo sul tempo di verifica del libro mastro del database.

Nota

Il cliente può comunque usare altri comandi, servizi o strumenti per copiare i dati dalla tabella di origine alla tabella di destinazione. Assicurarsi di evitare transazioni di grandi dimensioni perché ciò avrà un impatto sulle prestazioni sulla verifica del libro mastro del database.

Questo articolo illustra come convertire una tabella normale in una tabella del libro mastro.

Prerequisiti

Creare una tabella del libro mastro aggiornabile o append-only

Prima di poter usare la stored procedure sys.sp_copy_data_in_batches, è necessario creare una tabella libro mastro append-only o una tabella del libro mastro aggiornabile con lo stesso schema della tabella di origine. Lo schema deve essere identico in termini di numero di colonne, nomi delle colonne e relativi tipi di dati. Le colonne TRANSACTION ID, SEQUENCE NUMBER e GENERATED ALWAYS vengono ignorate perché vengono generate dal sistema. Gli indici tra le tabelle possono essere diversi, ma la tabella di destinazione può essere solo una tabella Heap o avere un indice cluster. Gli indici non cluster devono essere creati successivamente.

Supponiamo di avere la tabella normale Employees seguente nel database.

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
	);

Il modo più semplice per creare una tabella del libro mastro append-only o una tabella del libro mastro aggiornabile consiste nello script della tabella originale e nell'inserimento della clausola LEDGER = ON. Nello script seguente viene creata una nuova tabella del mastro aggiornabile, denominata Employees_LedgerTable in base allo schema della tabella Employees.

	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
    ); 

Copiare i dati da tabelle normali a tabelle del libro mastro

La stored procedure sys.sp_copy_data_in_batches copia i dati dalla tabella di origine alla tabella di destinazione dopo aver verificato che lo schema sia identico. I dati sono copiati in batch in singole transazioni. Se l'operazione non riesce, la tabella di destinazione viene popolata parzialmente. La tabella di destinazione deve anche essere vuota.

Nello script seguente si copiano i dati dalla tabella normale Employees alla nuova tabella del libro mastro aggiornabile, Employees_LedgerTable.

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