Risposte:
STATISTICS IO non include le letture dell'archivio versioni, almeno per l'archivio versioni in tempdb.
Ecco una demo per la prova:
--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
Avvia un ciclo di aggiornamento degli anni '30 in una scheda SSMS
--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
E mentre il ciclo procede, esegui due query identiche SNAPSHOTcon STATISTICS IO ON, separate da 15 secondi per consentire l'accumulo delle versioni.
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
Le statistiche IO mostrano letture identiche:

Ma il piano di esecuzione effettivo mostra che la scansione per la seconda query richiede molto più tempo, a causa della lettura dell'archivio versioni.

Per dimostrare a te stesso che questa query ha portato a letture tempdb, puoi utilizzare questa sessione di eventi estesi (che è ovviamente migliore di Profiler), filtrata per la sessione in cui sono in esecuzione le query di lettura:
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
Visualizzando i "dati in tempo reale" per quella sessione XE durante la demo, è possibile visualizzare le letture rispetto al database id 2 (tempdb) e acquisisce anche il testo della query della nostra query di lettura:
Un ringraziamento speciale a Paul White per aver sollevato questo problema con STATISTICS IO.