回答:
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
そして、ループの実行中SNAPSHOT
にSTATISTICS 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
ただし、実際の実行計画では、バージョンストアを読み取るため、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)に対する読み取りを確認でき、読み取りクエリのクエリテキストもキャプチャされます。
この問題をSTATISTICS IOで取り上げてくれたPaul Whiteに特に感謝します。