Yanıtlar:
STATISTICS IO
en azından tempdb'deki sürüm deposu için Version Store okumalarını içermez.
İşte kanıt için bir demo:
--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
Bir SSMS sekmesinde 30 saniyelik güncelleme döngüsü başlatma
--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
Ve döngü devam ederken, sürümlerin birikmesine izin vermek için 15 saniye SNAPSHOT
ile STATISTICS IO ON
ayrılmış iki özdeş sorgu çalıştırın .
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
ES istatistikleri aynı okumaları gösterir:
Ancak gerçek yürütme planı, sürüm deposunun okunması nedeniyle ikinci sorgunun taranmasının çok daha fazla zaman aldığını gösterir.
Bu sorgunun tempdb okumaları ile sonuçlandığını kendinize kanıtlamak için, okuma sorgularının çalıştığı oturuma filtre uygulanmış olan bu Genişletilmiş Etkinlikler oturumunu (Profiler'den açıkça daha iyi) kullanabilirsiniz:
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
Demo sırasında söz konusu XE oturumu için "canlı verileri" görüntüleyerek, veritabanı kimliği 2'ye (tempdb) göre okumaları görebilirsiniz ve okuma sorgumuzun sorgu metnini de yakalar:
İSTATİSTİK IO ile bu sorunu gündeme getirdiği için Paul White'a özel teşekkürler.