Jawaban:
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 SNAPSHOT
dengan 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:
Tetapi rencana eksekusi yang sebenarnya menunjukkan pemindaian untuk permintaan kedua mengambil lebih banyak waktu, karena membaca versi store.
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:
Terima kasih khusus kepada Paul White untuk mengemukakan masalah ini dengan STATISTIK IO.