SQL Server tiene una opción SET STATISTICS IO ON
que 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?
SQL Server tiene una opción SET STATISTICS IO ON
que 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?
Respuestas:
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 SNAPSHOT
con 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:
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.
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:
Un agradecimiento especial a Paul White por mencionar este problema con STATISTICS IO.