जवाबों:
STATISTICS IO
कम से कम tempdb में संस्करण स्टोर के लिए संस्करण स्टोर रीड्स को शामिल नहीं करता है।
यहाँ सबूत के लिए एक डेमो है:
--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
एक SSMS टैब में 30s अद्यतन लूप प्रारंभ करें
--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
और जब पाश जा रहा है, में दो समान क्वेरी चला SNAPSHOT
साथ STATISTICS IO ON
, 15s के द्वारा अलग जमा करने के लिए अनुमति देने के लिए संस्करणों।
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
IO आँकड़े समान रीड दिखाते हैं:
लेकिन वास्तविक निष्पादन योजना संस्करण स्टोर पढ़ने के कारण दूसरी क्वेरी के लिए स्कैन को अधिक समय लेती है।
अपने आप को यह साबित करने के लिए कि इस क्वेरी का परिणाम टेम्पर्ड रीड में है, आप इस विस्तारित ईवेंट्स सत्र (जो स्पष्ट रूप से प्रोइलर की तुलना में बेहतर है) का उपयोग कर सकते हैं, उस सत्र को फ़िल्टर किया जा सकता है जहां रीड क्वेरी चल रही हैं:
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
डेमो के दौरान उस XE सत्र के लिए "लाइव डेटा" को देखते हुए, आप डेटाबेस आईडी 2 (tempdb) के खिलाफ रीड्स देख सकते हैं, और यह हमारे रीड क्वेरी के क्वेरी टेक्स्ट को भी कैप्चर करता है:
स्टेटिस्टिक्स IO के साथ इस मुद्दे को लाने के लिए पॉल व्हाइट का विशेष धन्यवाद।