いくつかのクエリをテストするとき、データベースで復旧モデルを完全に設定し、TABLOCK
の有無にかかわらず、2つの同一の1M行挿入を実行しました。
TABLOCK
のあるものでは、9295
SQL Server 2008インスタンスのログレコードとその周辺8714
SQL Server 2017インスタンスのログレコード。
タブロックなしで挿入を実行すると、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
TABLOCK
を使用する場合、full model
でもlogging
は「効率的なロギング」と呼ばれ、insert
を行ごとにログする代わりに、pages
全体がログに記録されます。
これは、simple
モードではminimally logged
で、log
ではbulk logged
のみのpage allocations
モードですが、full
復旧モデルでは、pages
のdata
を完全にフォーマットしました。
したがって、records
およびsimple
モデルでfull
を使用して挿入するときにログに移動するtablock
の数はほぼ同じですが、内容は異なります。simple
/bulk logged
では、ページ番号のみが表示され、完全に表示されます。 pages
を完了します。
そして、insert
/full logging
ではsimple
rollback
に十分な情報しかないのに、insert
操作は完全に再構成できるこれらのログレコードを使用しているため、実際にはbulk logged
です。