Migrasikan data dari tabel biasa ke tabel ledger

Berlaku untuk: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Mengonversi tabel reguler ke tabel ledger tidak dimungkinkan, tetapi Anda dapat memigrasikan data dari tabel reguler yang ada ke tabel ledger, lalu mengganti tabel asli dengan tabel ledger.

Saat Anda melakukan verifikasi ledger database, prosesnya perlu memesan semua operasi dalam setiap transaksi. Jika Anda menggunakan SELECT INTO pernyataan atau BULK INSERT untuk menyalin beberapa miliar baris dari tabel biasa ke tabel ledger, semuanya akan dilakukan dalam satu transaksi tunggal. Ini berarti banyak data perlu diurutkan sepenuhnya, yang akan dilakukan dalam satu utas. Operasi pengurutan membutuhkan waktu lama untuk diselesaikan.

Untuk mengonversi tabel reguler menjadi tabel ledger, Microsoft merekomendasikan penggunaan prosedur tersimpan sys.sp_copy_data_in_batches . Ini membagi operasi salin dalam batch 10-100 K baris per transaksi. Akibatnya, verifikasi ledger database memiliki transaksi yang lebih kecil yang dapat diurutkan secara paralel. Ini sangat membantu waktu verifikasi ledger database.

Catatan

Pelanggan masih dapat menggunakan perintah, layanan, atau alat lain untuk menyalin data dari tabel sumber ke tabel target. Pastikan Anda menghindari transaksi besar karena ini akan berdampak pada verifikasi ledger database.

Artikel ini memperlihatkan kepada Anda cara mengonversi tabel reguler menjadi tabel ledger.

Prasyarat

Membuat tabel ledger khusus tambahan atau yang dapat diperbarui

Sebelum dapat menggunakan prosedur sys.sp_copy_data_in_batches tersimpan, Anda perlu membuat tabel ledger khusus tambahan atau tabel ledger yang dapat diperbarui dengan skema yang sama dengan tabel sumber. Skema harus identik dalam hal jumlah kolom, nama kolom, dan jenis datanya. TRANSACTION IDKolom , SEQUENCE NUMBER, dan GENERATED ALWAYS diabaikan karena dihasilkan sistem. Indeks di antara tabel bisa berbeda tetapi tabel target hanya bisa menjadi tabel Heap atau memiliki indeks berkluster. Indeks non-kluster harus dibuat setelahnya.

Asumsikan kita memiliki tabel reguler Employees berikut dalam database.

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

Cara term mudah untuk membuat tabel ledger khusus tambahan atau tabel ledger yang dapat diperbarui adalah membuat skrip tabel asli dan menambahkan LEDGER = ON klausa. Dalam skrip di bawah ini, kami membuat tabel ledger baru yang dapat diperbarui, yang disebut Employees_LedgerTable berdasarkan skema Employees tabel.

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

Menyalin data dari tabel biasa ke tabel ledger

Prosedur tersimpan sys.sp_copy_data_in_batches menyalin data dari tabel sumber ke tabel target setelah memverifikasi bahwa skemanya identik. Data disalin dalam batch dalam transaksi individual. Jika operasi gagal, tabel target diisi sebagian. Tabel target juga harus kosong.

Dalam skrip di bawah ini, kami menyalin data dari tabel reguler Employees ke tabel ledger baru yang dapat diperbarui, Employees_LedgerTable.

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