Migración de datos de tablas normales a tablas de libro de contabilidad
Se aplica a: SQL Server 2022 (16.x) Azure SQL Database Azure SQL Managed Instance
No es posible convertir tablas normales en tablas de libro de contabilidad, pero puede migrar los datos de una tabla normal existente a una tabla de libro de contabilidad y, a continuación, reemplazar la tabla original por la tabla del libro de contabilidad.
Al realizar una comprobación del libro de contabilidad de base de datos, el proceso debe ordenar todas las operaciones dentro de cada transacción. Si utiliza una instrucción SELECT INTO
o BULK INSERT
para copiar unos cuantos miles de millones de filas de una tabla normal a una tabla del libro de contabilidad, todo se hará en una sola transacción. Esto significa que hay que ordenar completamente muchos datos, lo que se hará en un solo subproceso. La operación de ordenación tarda mucho tiempo en completarse.
Para convertir una tabla normal en una tabla de libro de contabilidad, Microsoft recomienda usar el procedimiento almacenado sys.sp_copy_data_in_batches. Esto divide la operación de copia en lotes de 10 a 100 000 filas por transacción. Como resultado, la comprobación del libro de contabilidad de la base de datos tiene transacciones más pequeñas que se pueden ordenar en paralelo. Esto ayuda al tiempo de la comprobación del libro de contabilidad de la base de datos enormemente.
Nota:
El cliente todavía puede usar otros comandos, servicios o herramientas para copiar los datos de la tabla de origen en la tabla de destino. Asegúrese de evitar transacciones grandes, ya que esto tendrá un impacto en el rendimiento en la comprobación del libro de contabilidad de la base de datos.
En este artículo se muestra cómo convertir una tabla normal en una tabla de libro de contabilidad.
Requisitos previos
Creación de una tabla de libro de contabilidad actualizable o de solo anexión
Para poder usar el procedimiento almacenado sys.sp_copy_data_in_batches, debe crear una tabla de libro de contabilidad de solo anexión o una tabla de libro de contabilidad actualizable con el mismo esquema que la tabla de origen. El esquema debe ser idéntico en términos de número de columnas, nombres de columna y sus tipos de datos. Las columnas TRANSACTION ID
, SEQUENCE NUMBER
y GENERATED ALWAYS se omiten, ya que se generan en el sistema. Los índices entre las tablas pueden ser diferentes, pero la tabla de destino solo puede ser un montón o tener un índice agrupado. Los índices no agrupados se deben crear después.
Supongamos que tenemos la tabla normal Employees
siguiente en la base de datos.
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
);
La manera más fácil de crear una tabla de libro de contabilidad de solo anexión o una tabla de libro de contabilidad actualizable es crear scripts de la tabla original y agregar la cláusula LEDGER = ON
. En el siguiente script, vamos a crear una nueva tabla de libro de contabilidad actualizable, denominada Employees_LedgerTable
, basada en el esquema de la tabla 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
);
Copia de datos de una tabla normal a una tabla de libro de contabilidad
El procedimiento almacenado sys.sp_copy_data_in_batches copia los datos de la tabla de origen en la tabla de destino después de comprobar que su esquema es idéntico. Los datos se copian en lotes en transacciones individuales. Si se produce un error en la operación, la tabla de destino se rellena parcialmente. La tabla de destino también debe estar vacía.
En el siguiente script, vamos a copiar los datos de la tabla normal Employees
a la nueva tabla actualizable de libro de contabilidad, Employees_LedgerTable
.
sp_copy_data_in_batches @source_table_name = N'Employees' , @target_table_name = N'Employees_LedgerTable'