Перенос данных из обычных таблиц в таблицы реестра

Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure

Преобразовать обычные таблицы в таблицы реестра невозможно, но можно перенести данные из существующей обычной таблицы в таблицу реестра, а затем заменить исходную таблицу таблицей реестра.

При проверке реестра базы данных нужно упорядочить все операции в каждой транзакции. Если вы используете инструкцию SELECT INTO или BULK INSERT, скопировать несколько миллиардов строк с обычной таблицы в таблицу реестра можно будет с помощью одной транзакции. Это значит, что нужно полностью отсортировать большое количество данных, что будет выполнено в одном потоке. Операция сортировки занимает много времени.

Чтобы преобразовать обычную таблицу в таблицу реестра, корпорация Майкрософт рекомендует использовать хранимую процедуру sys.sp_copy_data_in_batches. Это разбивает операцию копирования в пакетах по 10–100 K строк на транзакцию. В результате проверка реестра базы данных имеет меньшие транзакции, которые можно отсортировать параллельно. Это помогает значительно уменьшить время проверки реестра базы данных.

Примечание.

Клиент по-прежнему может использовать другие команды, службы или инструменты для копирования данных из исходной таблицы в целевую. Убедитесь, что вы не используете большие транзакции, так как это повлияет на производительность проверки реестра базы данных.

В этой статье описано, как можно преобразовать обычную таблицу в таблицу реестра.

Необходимые компоненты

Создание таблицы реестра только для добавления или обновляемой таблицы реестра

Прежде чем использовать хранимую процедуру sys.sp_copy_data_in_batches, необходимо создать таблицу реестра только для добавления или обновляемую таблицу реестра с той же схемой, что и в исходной таблице. Схемы должны быть идентичными с точки зрения количества столбцов, имен столбцов и их типов данных. Столбцы TRANSACTION ID, SEQUENCE NUMBER и GENERATED 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_LedgerTable на основе схемы таблицы 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
    ); 

Копирование данных из обычной таблицы в таблицу реестра

Хранимая процедура 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'