답변:
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 탭에서 30 초 업데이트 루프 시작
--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
, 축적 버전을 할 수 있도록 15 초으로 구분.
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
그러나 실제 실행 계획은 버전 저장소를 읽음으로써 두 번째 쿼리에 대한 스캔에 훨씬 더 많은 시간이 걸린다는 것을 보여줍니다.
이 쿼리로 tempdb를 읽었 음을 증명하기 위해이 확장 이벤트 세션 (프로파일 러보다 분명히 우수함)을 사용하여 읽기 쿼리가 실행중인 세션으로 필터링 할 수 있습니다.
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 세션에 대한 "실시간 데이터"를 보면 데이터베이스 ID 2 (tempdb)에 대한 읽기를 볼 수 있으며 읽기 쿼리의 쿼리 텍스트도 캡처합니다.
STATISTICS IO에서이 문제를 제기 한 Paul White에게 특별한 감사를드립니다.