Ecco tre semplici test che leggono gli stessi dati, ma riportano letture logiche molto diverse:
Impostare
Lo script seguente crea una tabella di test con 100 righe identiche, ognuna contenente una colonna xml con dati sufficienti per garantire che sia archiviata fuori dalla riga. Nel mio database di test, la lunghezza dell'xml generato è di 20.204 byte per ogni riga.
-- 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;
test
I seguenti tre test leggono la colonna xml con:
- Una semplice
SELECT
dichiarazione - Assegnare l' xml a una variabile
- Utilizzo
SELECT INTO
per creare una tabella temporanea
-- 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;
risultati
L'output è:
=== Plain SELECT ==== Tabella 'XMLTest'. Conteggio scansioni 1, letture logiche 3, letture fisiche 1, letture anticipate 0, lob logico legge 795, lob fisico legge 37, lob read-ahead legge 796. === Assegna a una variabile ==== Tabella 'XMLTest'. Conteggio scansioni 1, letture logiche 3, letture fisiche 1, letture anticipate 0, lob logico legge 0, lob fisico legge 0, lob read-ahead legge 0. === SELEZIONA IN ==== Tabella 'XMLTest'. Conteggio scansioni 1, letture logiche 3, letture fisiche 1, letture anticipate 0, lob logico legge 300, lob fisico legge 37, lob read-ahead legge 400.
Domande
- Perché le letture LOB sono così diverse?
- Sicuramente gli stessi dati sono stati letti in ogni test?