Apakah STATISTIK IO output termasuk Versi Store dibaca?

9

SQL Server memiliki opsi SET STATISTICS IO ONyang menunjukkan jumlah halaman logis dan fisik membaca untuk permintaan. Apakah statistik ini menyertakan bacaan toko versi untuk kueri SNAPSHOT dan RCSI?

Forrest
sumber

Jawaban:

10

STATISTICS IO tidak termasuk membaca Versi Store, setidaknya untuk versi store di tempdb.

Ini demo untuk pembuktian:

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

Mulai loop pembaruan 30-an dalam satu tab 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

Dan ketika loop sedang berjalan, jalankan dua query yang identik SNAPSHOTdengan STATISTICS IO ON, dipisahkan oleh 15s untuk memungkinkan versi terakumulasi.

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

Statistik IO menunjukkan bacaan yang identik: Statistik IO

Tetapi rencana eksekusi yang sebenarnya menunjukkan pemindaian untuk permintaan kedua mengambil lebih banyak waktu, karena membaca versi store. Rencana aktual

Untuk membuktikan kepada diri sendiri bahwa kueri ini menghasilkan pembacaan tempdb, Anda dapat menggunakan sesi Acara yang Diperpanjang ini (yang jelas lebih baik daripada Profiler), difilter ke sesi tempat kueri baca dijalankan:

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

Melihat "data langsung" untuk sesi XE selama demo, Anda dapat melihat pembacaan terhadap database id 2 (tempdb), dan juga menangkap teks kueri dari kueri baca kami:

tangkapan layar sesi XE yang menunjukkan bacaan tempdb

Terima kasih khusus kepada Paul White untuk mengemukakan masalah ini dengan STATISTIK IO.

Forrest
sumber