Czy dane wyjściowe STATISTICS IO obejmują odczyty Version Store?

9

SQL Server ma opcję, SET STATISTICS IO ONktóra pokazuje liczbę logicznych i fizycznych odczytów strony dla zapytania. Czy te statystyki obejmują odczyty magazynu wersji dla zapytań SNAPSHOT i RCSI?

Forrest
źródło

Odpowiedzi:

10

STATISTICS IO nie obejmuje odczytów Version Store, przynajmniej dla magazynu wersji w tempdb.

Oto demo na dowód:

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

Rozpocznij pętlę aktualizacji 30s na jednej karcie 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

I podczas gdy pętla ma zamiar uruchomić dwa identyczne kwerend SNAPSHOTz STATISTICS IO ONoddzielonych 15s aby umożliwić wersje do akumuluj.

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

Statystyki IO pokazują identyczne odczyty: Statystyki IO

Rzeczywisty plan wykonania pokazuje jednak, że skanowanie drugiego zapytania zajmuje znacznie więcej czasu ze względu na odczyt magazynu wersji. Rzeczywiste plany

Aby udowodnić sobie, że to zapytanie spowodowało odczyty tempdb, możesz użyć tej sesji rozszerzonych zdarzeń (która jest oczywiście lepsza niż Profiler), przefiltrowanej do sesji, w której uruchomione są zapytania dotyczące odczytu:

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

Przeglądając „dane na żywo” dla tej sesji XE podczas demonstracji, możesz zobaczyć odczyty dla bazy danych id 2 (tempdb), a także przechwytuje tekst zapytania z naszego zapytania do odczytu:

zrzut ekranu sesji XE pokazujący odczyty tempdb

Specjalne podziękowania dla Paula White'a za poruszenie tego problemu w STATISTICS IO.

Forrest
źródło