Ran*_*gen 3 sql-server-2008 sql-server sql-server-2017
在测试某些查询时,我在数据库上将恢复模型设置为 full 并运行了两个相同的 1M 行插入,有和没有TABLOCK
.
在使用 时TABLOCK
,我绕过9295
了 sql server 2008 实例8714
上的日志记录,以及 SQL Server 2017 实例上的日志记录。
在没有 tabblock 的情况下运行插入时,我绕过1035659
了 2008 实例的1068599
记录和 2017 实例的记录。
在 sql server 2008 上测试的原因是为了匹配数据加载性能指南关于 ML 操作的恢复模型的声明:
仅当您的数据库处于大容量日志或简单恢复模式时,最少日志操作才可用。
那么,如果不是最小日志记录,这里看到的是什么?
Use DatabaseName
ALTER DATABASE DatabaseName SET RECOVERY FULL;
GO
BACKUP DATABASE DatabaseName TO DISK = '\\location\DatabaseName.bak';
BACKUP LOG DatabaseName TO DISK = '\\location\DatabaseName_log.trn';
GO
IF OBJECT_ID(N'dbo.Accounts', N'U') IS NOT NULL
BEGIN
DROP TABLE dbo.Accounts;
END;
GO
CREATE TABLE dbo.Accounts( AccountID INT PRIMARY KEY NOT NULL,
AccountName varchar(255),
DateCreated DATETIME2);
-- Insert 1M Rows into dbo.Account without TABLOCK
GO
SET STATISTICS IO, TIME ON;
INSERT INTO dbo.Accounts (AccountID,AccountName,DateCreated)
SELECT TOP(1000000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
'Name N ' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS varchar(255)),
DATEADD(MINUTE,-ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),GETDATE())
FROM MASTER..SPT_VALUES SPT1
CROSS APPLY MASTER..SPT_VALUES SPT2;
GO
-- check the amount of records in the log file
SELECT count(*)
FROM
fn_dbLog(NULL,NULL);
--1035659 rows
GO
-- clear the log
BACKUP LOG DatabaseName to disk = '\\location\DatabaseName_log2.trn';
GO
--drop the table
IF OBJECT_ID(N'dbo.Accounts', N'U') IS NOT NULL
BEGIN
DROP TABLE dbo.Accounts;
END;
GO
-- create the table
CREATE TABLE dbo.Accounts( AccountID INT PRIMARY KEY NOT NULL,
AccountName varchar(255),
DateCreated DATETIME2);
-- Insert 1M Rows into dbo.Account WITH TABLOCK
GO
SET STATISTICS IO, TIME ON;
INSERT INTO dbo.Accounts WITH(TABLOCK) (AccountID,AccountName,DateCreated)
SELECT TOP(1000000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
'Name N ' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS varchar(255)),
DATEADD(MINUTE,-ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),GETDATE())
FROM MASTER..SPT_VALUES SPT1
CROSS APPLY MASTER..SPT_VALUES SPT2;
GO
-- check the amount of records in the log file
SELECT count(*)
FROM
fn_dbLog(NULL,NULL);
--9295 rows
Run Code Online (Sandbox Code Playgroud)
当使用TABLOCK
您logging
即使在full model
被称为“有效的记录”,它是在代替记录每个insert
行由行全pages
被记录。
它将仅minimally logged
在simple
和bulk logged
模式page allocations
中log
,但在full
恢复模式中您已完全格式化pages
为data
。
所以records
登录simple
和full
插入时的模型数量tablock
几乎相同但内容不同:在simple
/bulk logged
将只有页码,完整将有完整pages
。
并且确实是full logging
因为insert
可以使用这些日志记录完全重构操作,而在simple
/ 中,bulk logged
您只有足够rollback
的信息insert
。
归档时间: |
|
查看次数: |
260 次 |
最近记录: |