Enthält die STATISTICS IO-Ausgabe Lesevorgänge im Version Store?

9

SQL Server verfügt über eine Option SET STATISTICS IO ON, die die Anzahl der logischen und physischen Seitenlesevorgänge für eine Abfrage anzeigt. Enthalten diese Statistiken Lesevorgänge des Versionsspeichers für SNAPSHOT- und RCSI-Abfragen?

Wald
quelle

Antworten:

10

STATISTICS IO enthält keine Versionsspeicher-Lesevorgänge, zumindest für den Versionsspeicher in tempdb.

Hier ist eine Demo zum Beweis:

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

Starten Sie eine 30s-Aktualisierungsschleife auf einer SSMS-Registerkarte

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

Führen Sie während der Schleife zwei identische Abfragen SNAPSHOTmit einem STATISTICS IO ONAbstand von 15 Sekunden aus, damit sich Versionen ansammeln können.

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

Die E / A-Statistiken zeigen identische Werte: Statistik IO

Der tatsächliche Ausführungsplan zeigt jedoch, dass der Scan für die zweite Abfrage aufgrund des Lesens des Versionsspeichers viel länger dauert. Aktuelle Pläne

Um sich selbst zu beweisen, dass diese Abfrage zu temporären Lesevorgängen geführt hat, können Sie diese Sitzung für erweiterte Ereignisse (die offensichtlich besser als Profiler ist) verwenden, die nach der Sitzung gefiltert ist, in der die Leseabfragen ausgeführt werden:

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

Wenn Sie die "Live-Daten" für diese XE-Sitzung während der Demo anzeigen, können Sie Lesevorgänge anhand der Datenbank-ID 2 (tempdb) anzeigen und den Abfragetext unserer Leseabfrage erfassen:

Screenshot der XE-Sitzung mit Tempdb-Lesevorgängen

Besonderer Dank geht an Paul White, der dieses Problem mit STATISTICS IO angesprochen hat.

Wald
quelle