Voici trois tests simples qui lisent les mêmes données, mais rapportent des lectures logiques très différentes:
Installer
Le script suivant crée une table de test avec 100 lignes identiques, chacune contenant une colonne xml avec suffisamment de données pour garantir son stockage hors ligne. Dans ma base de données de test, la longueur du xml généré est de 20 204 octets pour chaque ligne.
-- 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;
Les tests
Les trois tests suivants lisent la colonne xml avec:
- Une
SELECT
déclaration simple - Assigner le xml à une variable
- Utilisation
SELECT INTO
pour créer une table temporaire
-- 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;
Résultats
La sortie est:
=== Plain SELECT ==== Tableau 'XMLTest'. Nombre de balayages 1, lectures logiques 3, lectures physiques 1, lectures anticipées 0, lob logique lit 795, lob physique lit 37, lob read-ahead lit 796. === Attribuer à une variable ==== Tableau 'XMLTest'. Nombre de balayages 1, lectures logiques 3, lectures physiques 1, lectures anticipées 0, lob logique lit 0, lob physique lit 0, lob read-ahead lit 0. === SELECT INTO ==== Tableau 'XMLTest'. Nombre de balayages 1, lectures logiques 3, lectures physiques 1, lectures anticipées 0, lob logique lit 300, lob physique lit 37, lob read-ahead lit 400.
Des questions
- Pourquoi les lectures LOB sont-elles si différentes?
- Certes, les mêmes données exactes ont été lues dans chaque test?