Sdílet prostřednictvím


Migrace dat z běžných tabulek do tabulek registru

Platí pro: SQL Server 2022 (16.x) a novější verze Azure SQL DatabaseAzure SQL Managed Instance

Převod běžných tabulek na tabulky registru není možný, ale můžete migrovat data z existující běžné tabulky do tabulky registru a potom původní tabulku nahradit tabulkou registru.

Když provádíte ověření registru databáze, musí proces uspořádat všechny operace v rámci každé transakce. Pokud použijete SELECT INTO příkaz nebo BULK INSERT zkopírujete několik miliard řádků z běžné tabulky do tabulky registru, vše se provede v jedné transakci. To znamená, že spousta dat musí být plně seřazená, což se provede v jednom vlákně. Dokončení operace řazení trvá dlouho.

Chcete-li převést běžnou tabulku na tabulku registru, společnost Microsoft doporučuje použít sys.sp_copy_data_in_batches uloženou proceduru. Tím se operace kopírování rozdělí do dávek 10 až 100 tisíc řádků na transakci. V důsledku toho má ověření registru databáze menší transakce, které lze seřadit paralelně. To značně zlepšuje čas potřebný pro ověření registru databáze.

Poznámka:

Zákazník může dál používat jiné příkazy, služby nebo nástroje ke zkopírování dat ze zdrojové tabulky do cílové tabulky. Ujistěte se, že se vyhnete velkým transakcím, protože to bude mít vliv na výkon na ověření registru databáze.

V tomto článku se dozvíte, jak můžete převést běžnou tabulku na tabulku registru.

Požadavky

Vytvořit tabulku registru pouze pro přidávání nebo tabulku registru, kterou lze aktualizovat

Než budete moct použít sys.sp_copy_data_in_batches uloženou proceduru, musíte vytvořit tabulku registru jen pro připojení nebo aktualizovatelnou tabulku registru se stejným schématem jako zdrojová tabulka. Schéma by mělo být identické z hlediska počtu sloupců, názvů sloupců a jejich datových typů. TRANSACTION ID, SEQUENCE NUMBERa GENERATED ALWAYS sloupce jsou ignorovány, protože jsou generovány systémem. Indexy mezi tabulkami se můžou lišit, ale cílovou tabulkou může být pouze tabulka haldy nebo clusterovaný index. Následně by se měly vytvořit neskupené indexy.

Předpokládejme, že v databázi máme následující běžnou Employees tabulku.

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

Nejjednodušší způsob, jak vytvořit tabulku registru jen pro připojení nebo aktualizovatelnou tabulku registru , je skriptovat původní tabulku a přidat klauzuli LEDGER = ON . Ve skriptu níže vytváříme novou aktualizovatelnou tabulku registru, která je volána Employees_LedgerTable na základě schématu Employees tabulky.

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

Kopírování dat z běžné tabulky do tabulky registru

Uložená procedura sys.sp_copy_data_in_batches kopíruje data ze zdrojové tabulky do cílové tabulky po ověření, že je jejich schéma stejné. Data se kopírují v dávkách v jednotlivých transakcích. Pokud operace selže, cílová tabulka se částečně naplní. Cílová tabulka by měla být také prázdná.

Ve skriptu níže kopírujeme data z běžné Employees tabulky do nové aktualizovatelné tabulky registru. Employees_LedgerTable

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