¿La salida STATISTICS IO incluye lecturas del almacén de versiones?

9

SQL Server tiene una opción SET STATISTICS IO ONque muestra el número de lecturas de página lógicas y físicas para una consulta. ¿Estas estadísticas incluyen lecturas de la tienda de versiones para consultas SNAPSHOT y RCSI?

Para descanso
fuente

Respuestas:

10

STATISTICS IO no incluye las lecturas del almacén de versiones, al menos para el almacén de versiones en tempdb.

Aquí hay una demostración como prueba:

--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

Inicie un ciclo de actualización de 30 segundos en una pestaña 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

Y mientras continúa el ciclo, ejecute dos consultas idénticas SNAPSHOTcon STATISTICS IO ON, separadas por 15 segundos para permitir que se acumulen versiones.

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

Las estadísticas de IO muestran lecturas idénticas: Stats IO

Pero el plan de ejecución real muestra que la exploración de la segunda consulta lleva mucho más tiempo, debido a la lectura del almacén de versiones. Planes reales

Para probarse a sí mismo que esta consulta resultó en lecturas tempdb, puede usar esta sesión de Eventos extendidos (que obviamente es mejor que Profiler), filtrada a la sesión donde se ejecutan las consultas de lectura:

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

Al ver los "datos en vivo" para esa sesión XE durante la demostración, puede ver las lecturas contra la base de datos ID 2 (tempdb), y también captura el texto de la consulta de nuestra consulta de lectura:

captura de pantalla de la sesión XE que muestra lecturas tempdb

Un agradecimiento especial a Paul White por mencionar este problema con STATISTICS IO.

Para descanso
fuente