Compartilhar via


Migrar dados de tabelas regulares para tabelas do razão

Aplica-se a: SQL Server 2022 (16.x) Banco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Não é possível converter tabelas regulares em tabelas do razão, mas você pode migrar os dados de uma tabela regular existente para uma tabela do razão e, em seguida, substituir a tabela original pela tabela do razão.

Quando você está executando uma verificação do razão do banco de dados, o processo precisa ordenar todas as operações dentro de cada transação. Se você usar uma instrução SELECT INTO ou BULK INSERT para copiar alguns bilhões de linhas de uma tabela regular para uma tabela do razão, tudo será feito em uma única transação. Isso significa que uma grande quantidade de dados precisará ser totalmente classificada, e isso será feito em um único thread. A operação de classificação leva muito tempo para ser concluída.

Para converter uma tabela regular em uma tabela do razão, a Microsoft recomenda usar o procedimento armazenado sys.sp_copy_data_in_batches. Isso divide a operação de cópia em lotes de 10 a 100 mil linhas por transação. Como resultado, a verificação do razão do banco de dados tem transações menores que podem ser classificadas em paralelo. Isso ajudará muito no tempo de verificação do razão do banco de dados.

Observação

O cliente ainda poderá usar outros comandos, serviços ou ferramentas para copiar os dados da tabela de origem para a tabela de destino. Evite transações grandes, porque isso terá um impacto no desempenho da verificação do razão do banco de dados.

Este artigo mostra como converter uma tabela regular em uma tabela do razão.

Pré-requisitos

Criar uma tabela do razão somente acréscimo ou atualizável

Para usar o procedimento armazenado sys.sp_copy_data_in_batches, você precisa criar uma tabela do razão somente acréscimo ou uma tabela do razão atualizável com o mesmo esquema da tabela de origem. O esquema deve ser idêntico em termos de número de colunas, nomes de colunas e os tipos de dados. As colunas TRANSACTION ID, SEQUENCE NUMBER e GENERATED ALWAYS são ignoradas, pois são geradas pelo sistema. Os índices podem ser diferentes entre as tabelas, mas a tabela de destino só pode ser uma tabela de Heap ou ter um índice clusterizado. Índices não clusterizados devem ser criados posteriormente.

Suponha que temos a tabela regular Employees a seguir no banco de dados.

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

A maneira mais fácil de criar uma tabela do razão somente acréscimo ou uma tabela do razão atualizável é criar o script da tabela original e adicionar a cláusula LEDGER = ON. No script abaixo, estamos criando uma tabela de razão atualizável, chamada Employees_LedgerTable com base no esquema da tabela 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
    ); 

Copiar dados de uma tabela regular para uma tabela do razão

O procedimento armazenado sys.sp_copy_data_in_batches copia dados da tabela de origem para a tabela de destino depois de verificar se o esquema é idêntico. Os dados são copiados em lotes em transações individuais. Se a operação falhar, a tabela de destino será populada parcialmente. A tabela de destino também deverá estar vazia.

No script abaixo, estamos copiando os dados da tabela regular Employees para a nova tabela atualizável do razão, a Employees_LedgerTable.

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