Sql-Server
當臨時表上發生 DML 和 DDL 更改時,歷史表中的相關更改是否也會記錄在事務日誌中?
當對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;
現在,如果我更新表中的一行,然後對日誌執行相同的查詢:
UPDATE dbo.Employee SET AnnualSalary = 3.50; GO
這 6 條新的日誌記錄是:
- 2 用於隱式事務的開始/結束
- 2 用於更新差異備份點陣圖
- 1 用於更新基表
- 1 用於“隱藏”插入到歷史表中
如果我更改
CREATE TABLE
語句以刪除系統版本控制相關項,然後重新執行展示,日誌的最終狀態如下所示:這是否意味著啟用臨時表將有效地使通過事務日誌的數據量翻倍
它不會完全翻倍(插入主表不會對歷史表進行任何更改),但是肯定會增加日誌吞吐量。