分享方式:


將資料從一般資料表遷移至總帳資料表

適用於:SQL Server 2022 (16.x) Azure SQL 資料庫 Azure SQL 受控執行個體

無法將一般資料表轉換成總帳資料表,但您可以將資料從現有的一般資料表移轉至總帳資料表,然後將原始資料表取代為總帳資料表。

當您執行資料庫總帳驗證時,此流程必須排序每個交易內的所有作業。 如果您使用 SELECT INTOBULK INSERT 陳述式,將數十億個資料列從一般資料表複製到總帳資料表,則全部都會在單一交易中完成。 這表示必須完整排序大量資料,這會在單一執行緒中完成。 排序作業需要很長的時間才能完成。

若要將一般資料表轉換成總帳資料表,Microsoft 建議使用 sys.sp_copy_data_in_batches 預存程序。 這會以每個交易 10-100K 個資料列的批次分割複製作業。 因此,資料庫總帳驗證會有較小、可平行排序的交易。 這可大幅協助縮短資料庫總帳驗證的時間。

注意

客戶仍然可以使用其他命令、服務或工具,將資料從來源資料表複製到目標資料表。 請確定您避免大型交易,因為這會對資料庫總帳驗證的效能造成影響。

本文說明如何將一般資料表轉換成總帳資料表。

必要條件

建立僅限附加的總帳資料表

使用 sys.sp_copy_data_in_batches 預存程序之前,您必須建立僅附加總帳資料表,或具有與來源資料表相同結構描述的可更新總帳資料表。 結構描述應該與資料行數量、資料行名稱及其資料類型相同。 TRANSACTION IDSEQUENCE NUMBERGENERATED 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 資料表的結構描述來建立名為 Employees_LedgerTable新可更新總帳資料表

	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'