Відповіді:
STATISTICS IO
не включає читання версій Store Store, принаймні для зберігання версій у 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
Запустіть цикл оновлення 30-х років на одній вкладці 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
І в той час як цикл буде, працювати два однакових запитів в 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 показує однакові показання:
Але власне план виконання показує, що сканування другого запиту займає набагато більше часу, завдяки прочитанню сховища версій.
Щоб довести собі, що цей запит призвів до зчитування tempdb, ви можете використовувати цей розширений сеанс подій (що, очевидно, краще, ніж Profiler), відфільтрований до сеансу, де виконуються запити читання:
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), і він також фіксує текст запиту нашого запиту читання:
Особлива подяка Полю Уайту за те, що він вирішив цю проблему зі СТАТИСТИКИ ІО.