Sql-Server

當臨時表上發生 DML 和 DDL 更改時,歷史表中的相關更改是否也會記錄在事務日誌中?

  • August 3, 2022

當對Temporal Table執行 DML 和 DDL 查詢時,這些更改會適當地傳播到相關的 History 表。例如UPDATE,臨時表會導致將新記錄INSERT編輯到歷史表中以反映該更改。

INSERT記錄在事務日誌中的歷史表以及其他傳播的更改嗎?

這是否意味著啟用臨時表將有效地使通過事務日誌的數據量翻倍(至少對於恢復模型設置為完整的數據庫)?

是的,對歷史表的更改會被記錄下來。

如果您考慮事務日誌的目的,它是為了允許恢復(通過備份和恢復,或在數據庫啟動時發生的正常恢復過程)。如果沒有記錄對歷史表的更改,則使用臨時表恢復數據庫的備份可能會導致主表和歷史表之間的不一致。

這是一個小展示。該設置創建一個臨時表,插入一行,更新該行,然後清除日誌。

USE [master];
GO

DROP DATABASE IF EXISTS [315097];
GO

CREATE DATABASE [315097];
ALTER DATABASE [315097] SET RECOVERY SIMPLE 
GO

USE [315097];
GO

CREATE TABLE dbo.Employee
(
   EmployeeID int NOT NULL, 
   [Name] nvarchar(100) NOT NULL, 
   Position varchar(100) NOT NULL, 
   Department varchar(100) NOT NULL, 
   [Address] nvarchar(1024) NOT NULL, 
   AnnualSalary decimal (10,2) NOT NULL, 
   ValidFrom datetime2 GENERATED ALWAYS AS ROW START, 
   ValidTo datetime2 GENERATED ALWAYS AS ROW END,

   PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
   CONSTRAINT PK_Employee PRIMARY KEY (EmployeeID)
)
WITH 
(
   SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory)
);
GO

/*
INSERT an initial row to avoid a lot of "noise" in this test related to inserting
the very first row into these tables
*/
INSERT INTO dbo.Employee
   (EmployeeID, [Name], Position, Department, [Address], AnnualSalary)
VALUES
   (1, N'Josh', 'Trusted User', 'I.T.', N'123 Main St', 3.50);

UPDATE dbo.Employee
SET AnnualSalary = 4.00;
GO

/*
Clear the log
*/
BACKUP DATABASE [315097] TO DISK = N'NUL';
GO
CHECKPOINT;
GO
/*
Query showing only checkpoints
*/
SELECT 
   l.[Current LSN],
   l.Operation,
   l.Context,
   l.AllocUnitName
FROM fn_dblog(NULL, NULL) l;

SSMS 中的查詢結果截圖,僅顯示 3 條與 CHECKPOINT 操作相關的日誌記錄

現在,如果我更新表中的一行,然後對日誌執行相同的查詢:

UPDATE dbo.Employee
SET AnnualSalary = 3.50;
GO

SSMS 查詢結果截圖,顯示了與更新主表和插入歷史表相關的 6 條新日誌記錄

這 6 條新的日誌記錄是:

  • 2 用於隱式事務的開始/結束
  • 2 用於更新差異備份點陣圖
  • 1 用於更新基表
  • 1 用於“隱藏”插入到歷史表中

如果我更改CREATE TABLE語句以刪除系統版本控制相關項,然後重新執行展示,日誌的最終狀態如下所示:

SSMS 中的查詢結果螢幕截圖僅顯示 4 條與主表更新相關的新日誌記錄

這是否意味著啟用臨時表將有效地使通過事務日誌的數據量翻倍

它不會完全翻倍(插入主表不會對歷史表進行任何更改),但是肯定會增加日誌吞吐量。

引用自:https://dba.stackexchange.com/questions/315097