Câu trả lời:
STATISTICS IO
không bao gồm các phiên bản Store Store, ít nhất là cho phiên bản lưu trữ trong tempdb.
Đây là bản demo để chứng minh:
--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
Bắt đầu vòng lặp cập nhật 30 giây trong một 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
Và trong khi vòng lặp được đi, chạy hai truy vấn giống hệt nhau trong SNAPSHOT
với STATISTICS IO ON
, cách nhau bằng 15s để cho phép các phiên bản để tích lũy.
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
Số liệu thống kê IO hiển thị các lần đọc giống hệt nhau:
Nhưng kế hoạch thực hiện thực tế cho thấy quá trình quét tìm truy vấn thứ hai mất nhiều thời gian hơn, do đọc cửa hàng phiên bản.
Để tự chứng minh rằng truy vấn này dẫn đến việc đọc tempdb, bạn có thể sử dụng phiên Sự kiện mở rộng này (rõ ràng là tốt hơn Profiler), được lọc đến phiên nơi các truy vấn đọc đang chạy:
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
Xem "dữ liệu trực tiếp" cho phiên XE đó trong bản demo, bạn có thể thấy các lần đọc đối với cơ sở dữ liệu id 2 (tempdb) và nó cũng nắm bắt văn bản truy vấn của truy vấn đọc của chúng tôi:
Đặc biệt cảm ơn Paul White đã đưa ra vấn đề này với STATISTICS IO.