Aqui estão três testes simples que lêem os mesmos dados, mas relatam leituras lógicas muito diferentes:
Configuração
O script a seguir cria uma tabela de teste com 100 linhas idênticas, cada uma contendo uma coluna xml com dados suficientes para garantir que ela seja armazenada fora da linha. No meu banco de dados de teste, o comprimento do xml gerado é 20.204 bytes para cada linha.
-- 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;
Testes
Os três testes a seguir leem a coluna xml com:
- Uma
SELECT
declaração clara - Atribuindo o xml a uma variável
- Usando
SELECT INTO
para criar uma tabela temporária
-- 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;
Resultados
A saída é:
=== Simples SELECT ==== Tabela 'XMLTest'. Contagem de digitalizações 1, leituras lógicas 3, leituras físicas 1, leituras antecipadas 0, lob lógico lê 795, lob físico lê 37, lob read-ahead lê 796. === Atribuir a uma variável ==== Tabela 'XMLTest'. Contagem de digitalizações 1, leituras lógicas 3, leituras físicas 1, leituras antecipadas 0, lob lógico lê 0, lob físico lê 0, lob read-ahead lê 0. === SELECIONAR EM ==== Tabela 'XMLTest'. Contagem de digitalizações 1, leituras lógicas 3, leituras físicas 1, leituras antecipadas 0, lob lê 300, lógico lê 37, lob lê 400.
Questões
- Por que as leituras LOB são tão diferentes?
- Certamente os mesmos dados foram lidos em cada teste?