統計IO出力にはバージョンストア読み取りが含まれますか?


9

SQL Serverには、SET STATISTICS IO ONクエリの論理および物理ページ読み取りの数を示すオプションがあります。これらの統計には、SNAPSHOTおよびRCSIクエリのバージョンストアの読み取りが含まれていますか?

回答:


10

STATISTICS IO 少なくともtempdbのバージョンストアでは、バージョンストアの読み取りは含まれません。

ここに証明のためのデモがあります:

--setup script
USE master
GO

CREATE DATABASE TestDB
GO

ALTER DATABASE TestDB
SET ALLOW_SNAPSHOT_ISOLATION ON
GO

USE TestDB
GO

DROP TABLE IF EXISTS dbo.Test
GO

CREATE TABLE dbo.Test (ID int identity PRIMARY KEY, junk int)

INSERT dbo.Test
SELECT TOP (100000) 1
FROM master.dbo.spt_values a
CROSS JOIN master.dbo.spt_values b

1つのSSMSタブで30秒の更新ループを開始する

--UPDATE loop
SET NOCOUNT ON
DECLARE @stop datetime = DATEADD(SECOND, 30, GETDATE())

WHILE GETDATE() < @stop
BEGIN
    BEGIN TRAN

    UPDATE dbo.Test
    SET junk += 1

    COMMIT
END

UPDATE dbo.Test
SET junk = 1

そして、ループの実行中SNAPSHOTSTATISTICS IO ON、バージョンを累積できるように、15秒で区切られた2つの同じクエリをwith で実行します。

USE TestDB
SET STATISTICS IO ON
GO

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

BEGIN TRAN

SELECT MAX(junk)
FROM dbo.Test

WAITFOR DELAY '00:00:15'

SELECT MAX(junk)
FROM dbo.Test

COMMIT

IO統計は同一の読み取りを示します。 統計IO

ただし、実際の実行計画では、バージョンストアを読み取るため、2番目のクエリのスキャンに時間がかかることが示されています。 実際の計画

このクエリによってtempdbの読み取りが発生したことを自分で証明するには、この拡張イベントセッション(プロファイラーよりも明らかに優れています)を使用して、読み取りクエリが実行されているセッションにフィルター処理します。

CREATE EVENT SESSION [file_reads] ON SERVER 
ADD EVENT sqlserver.file_read_completed(
    ACTION(sqlserver.session_id,sqlserver.sql_text)
    WHERE ([sqlserver].[session_id]=(52)))
ADD TARGET package0.event_file(SET filename=N'file_reads')
GO

デモ中にそのXEセッションの「ライブデータ」を表示すると、データベースID 2(tempdb)に対する読み取りを確認でき、読み取りクエリのクエリテキストもキャプチャされます。

tempdbの読み取りを示すXEセッションのスクリーンショット

この問題をSTATISTICS IOで取り上げてくれたPaul Whiteに特に感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.