web-dev-qa-db-ja.com

完全復旧モデルとタブロック挿入ログ

いくつかのクエリをテストするとき、データベースで復旧モデルを完全に設定し、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
3
Randi Vertongen

TABLOCKを使用する場合、full modelでもloggingは「効率的なロギング」と呼ばれ、insertを行ごとにログする代わりに、pages全体がログに記録されます。

これは、simpleモードではminimally loggedで、logではbulk loggedのみのpage allocationsモードですが、full復旧モデルでは、pagesdataを完全にフォーマットしました。

したがって、recordsおよびsimpleモデルでfullを使用して挿入するときにログに移動するtablockの数はほぼ同じですが、内容は異なります。simple/bulk loggedでは、ページ番号のみが表示され、完全に表示されます。 pagesを完了します。

そして、insert/full loggingではsimplerollbackに十分な情報しかないのに、insert操作は完全に再構成できるこれらのログレコードを使用しているため、実際にはbulk loggedです。

6
sepupic