Hier sind drei einfache Tests, die dieselben Daten lesen, jedoch sehr unterschiedliche logische Lesevorgänge melden:
Installieren
Das folgende Skript erstellt eine Testtabelle mit 100 identischen Zeilen, von denen jede eine XML- Spalte mit genügend Daten enthält, um sicherzustellen, dass sie außerhalb der Zeile gespeichert werden. In meiner Test - Datenbank, die Länge des xml erzeugte 20.204 Bytes für jede Zeile.
-- Conditional drop
IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL
DROP TABLE dbo.XMLTest;
GO
-- Create test table
CREATE TABLE dbo.XMLTest
(
ID integer IDENTITY PRIMARY KEY,
X xml NULL
);
GO
-- Add 100 wide xml rows
DECLARE @X xml;
SET @X =
(
SELECT TOP (100) *
FROM sys.columns AS C
FOR XML
PATH ('row'),
ROOT ('root'),
TYPE
);
INSERT dbo.XMLTest
(X)
SELECT TOP (100)
@X
FROM sys.columns AS C;
-- Flush dirty buffers
CHECKPOINT;
Tests
Die folgenden drei Tests lesen die XML- Spalte mit:
- Eine klare
SELECT
Aussage - Zuweisen der XML zu einer Variablen
- Verwenden Sie
SELECT INTO
, um eine temporäre Tabelle zu erstellen
-- No row count messages or graphical plan
-- Show I/O statistics
SET NOCOUNT ON;
SET STATISTICS XML OFF;
SET STATISTICS IO ON;
GO
PRINT CHAR(10) + '=== Plain SELECT ===='
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
SELECT XT.X
FROM dbo.XMLTest AS XT;
GO
PRINT CHAR(10) + '=== Assign to a variable ===='
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
DECLARE @X xml;
SELECT
@X = XT.X
FROM dbo.XMLTest AS XT;
GO
PRINT CHAR(10) + '=== SELECT INTO ===='
IF OBJECT_ID(N'tempdb..#T', N'U') IS NOT NULL
DROP TABLE #T;
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
SELECT
XT.X
INTO #T
FROM dbo.XMLTest AS XT
GO
SET STATISTICS IO OFF;
Ergebnisse
Die Ausgabe ist:
=== Plain SELECT ==== Tabelle 'XMLTest'. Scananzahl 1, logische Lesevorgänge 3, physische Lesevorgänge 1, Vorauslesevorgänge 0, logische Lesevorgänge 795, physikalische Lesevorgänge 37, Vorauslesevorgänge 796. === Einer Variablen zuweisen ==== Tabelle 'XMLTest'. Scananzahl 1, logische Lesevorgänge 3, physische Lesevorgänge 1, Vorauslesevorgänge 0, lob logische Lesevorgänge 0, lob physikalische Lesevorgänge 0, lob Vorauslesevorgänge 0. === SELECT INTO ==== Tabelle 'XMLTest'. Scananzahl 1, logische Lesevorgänge 3, physische Lesevorgänge 1, Vorauslesevorgänge 0, logische Lesevorgänge 300, physikalische Lesevorgänge 37, Vorauslesevorgänge 400.
Fragen
- Warum liest sich das LOB so anders?
- Sicherlich wurden bei jedem Test genau die gleichen Daten gelesen?