本期特别如何將一般的資料表搬移到總帳資料表。
因為大多數的系統是已經被建立完成的,日後才升級到 SQL Server 2022的版本,因此總帳不是在建立資料表的時後被設定
而是資料表已經建立完成,然後需要透過搬移的方式完成,那麼,該如何做呢?
一般資料表搬移到總帳資料表
無法將一般資料表透過轉換的方式,變成總帳資料表,但是你可以將資料從現有的一般資料表移轉至總帳資料表,然後將原始
資料表取代為總帳資料表。
當執行資料庫總帳驗證時,此流程必須排序每個交易內的所有作業。 如果使用
SELECT INTO
或
BULK INSERT
句子的話,將數十億個資料列
從一般資料表複製到總帳資料表,則全部都會在單一交易中完成。 這表示必須完整排序大量資料,這會在單一執行緒中完成。 排序作業需要很長的時間才能完成。
若要將一般資料表轉換成總帳資料表,微軟建議使用
sys.sp_copy_data_in_batches
預存程序。 這會以每筆交易 1萬到10萬筆的資料列的批次分割複製作業。
因此,資料庫總帳驗證具有較小的交易,可以平行排序。 這可大幅協助縮短資料庫總帳驗證的時間。
建立僅附加的總帳資料表
使用
sys.sp_copy_data_in_batches
預存程序之前,你要建立
僅附加總帳資料表
,或具有與來源資料表相同結構描述的
可更新總帳資料表
。
結構描述應該與資料行數量、資料行名稱及其資料類型相同。
TRANSACTION ID
、
SEQUENCE NUMBER
和
GENERATED ALWAYS
資料行會遭到忽略,因為它們是系統產生的。
資料表之間的編製索引可能不同,但目標資料表只能是沒有叢集的 heap資料表或具有叢集索引。 之後應該建立非叢集索引。
假設我們在資料庫中有下列一般
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
SYSTEM_VERSIONING = ON,
LEDGER = ON
將資料從一般資料表複製到總帳資料表
資料會在個別的交易中以批次方式複製。 如果作業失敗,則會部分填入目標資料表。 目標資料表也應該為空白。
在下列指令碼中,我們會將資料從一般
Employees
資料表複製到新的可更新總帳資料表 (
Employees_LedgerTable
)。
sp_copy_data_in_batches @source_table_name = N'Employees' , @target_table_name = N'Employees_LedgerTable'
事實上,並沒有一個快速的方法,可以馬上的把一般的資料表轉成總帳資料表,也沒有什麼精靈能夠這樣做,微軟官方說明的建議就是
先建立一個總帳資料表,再利用預存程序 sp_copy_data_in_batches的方式完成。