STATISTICS IO 출력에 버전 저장소 읽기가 포함됩니까?


9

SQL Server에는 SET STATISTICS IO ON쿼리에 대한 논리적 및 물리적 페이지 읽기 수를 표시 하는 옵션 이 있습니다. 이 통계에 SNAPSHOT 및 RCSI 쿼리에 대한 버전 저장소 읽기가 포함됩니까?

답변:


10

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

IO 통계는 동일한 판독 값을 보여줍니다. 통계 IO

그러나 실제 실행 계획은 버전 저장소를 읽음으로써 두 번째 쿼리에 대한 스캔에 훨씬 더 많은 시간이 걸린다는 것을 보여줍니다. 실제 계획

이 쿼리로 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)에 대한 읽기를 볼 수 있으며 읽기 쿼리의 쿼리 텍스트도 캡처합니다.

tempdb 읽기를 보여주는 XE 세션의 스크린 샷

STATISTICS IO에서이 문제를 제기 한 Paul White에게 특별한 감사를드립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.