L'output STATISTICS IO include le letture di Version Store?


9

SQL Server ha un'opzione SET STATISTICS IO ONche mostra il numero di letture di pagine logiche e fisiche per una query. Queste statistiche includono letture dell'archivio versioni per le query SNAPSHOT e RCSI?

Risposte:


10

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 SNAPSHOTcon 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: Statistiche IO

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. Piani reali

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:

screenshot della sessione XE che mostra letture tempdb

Un ringraziamento speciale a Paul White per aver sollevato questo problema con STATISTICS IO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.