SQL Server verfügt über eine Option SET STATISTICS IO ON
, die die Anzahl der logischen und physischen Seitenlesevorgänge für eine Abfrage anzeigt. Enthalten diese Statistiken Lesevorgänge des Versionsspeichers für SNAPSHOT- und RCSI-Abfragen?
SQL Server verfügt über eine Option SET STATISTICS IO ON
, die die Anzahl der logischen und physischen Seitenlesevorgänge für eine Abfrage anzeigt. Enthalten diese Statistiken Lesevorgänge des Versionsspeichers für SNAPSHOT- und RCSI-Abfragen?
STATISTICS IO
enthält keine Versionsspeicher-Lesevorgänge, zumindest für den Versionsspeicher in tempdb.
Hier ist eine Demo zum Beweis:
--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
Starten Sie eine 30s-Aktualisierungsschleife auf einer SSMS-Registerkarte
--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
Führen Sie während der Schleife zwei identische Abfragen SNAPSHOT
mit einem STATISTICS IO ON
Abstand von 15 Sekunden aus, damit sich Versionen ansammeln können.
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
Die E / A-Statistiken zeigen identische Werte:
Der tatsächliche Ausführungsplan zeigt jedoch, dass der Scan für die zweite Abfrage aufgrund des Lesens des Versionsspeichers viel länger dauert.
Um sich selbst zu beweisen, dass diese Abfrage zu temporären Lesevorgängen geführt hat, können Sie diese Sitzung für erweiterte Ereignisse (die offensichtlich besser als Profiler ist) verwenden, die nach der Sitzung gefiltert ist, in der die Leseabfragen ausgeführt werden:
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
Wenn Sie die "Live-Daten" für diese XE-Sitzung während der Demo anzeigen, können Sie Lesevorgänge anhand der Datenbank-ID 2 (tempdb) anzeigen und den Abfragetext unserer Leseabfrage erfassen:
Besonderer Dank geht an Paul White, der dieses Problem mit STATISTICS IO angesprochen hat.