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 SNAPSHOT
con 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.