Вот три простых теста, которые читают одни и те же данные, но сообщают об очень разных логических чтениях:
Настроить
Следующий скрипт создает тестовую таблицу с 100 одинаковыми строками, каждая из которых содержит столбец xml с достаточным количеством данных, чтобы обеспечить его сохранение вне строки. В моей тестовой базе данных длина сгенерированного xml составляет 20 204 байта для каждой строки.
-- 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;
тесты
Следующие три теста читают столбец xml :
- Простое
SELECT
утверждение - Присвоение xml переменной
- Использование
SELECT INTO
для создания временной таблицы
-- 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;
Полученные результаты
Выход:
=== Обычный SELECT ==== Таблица «XMLTest». Сканирование 1, логическое чтение 3, физическое чтение 1, чтение с опережением 0, lob логическое чтение 795, lob физическое чтение 37, lob read-forward читает 796. === Назначить переменной ==== Таблица «XMLTest». Сканирование 1, логическое чтение 3, физическое чтение 1, чтение с опережением 0, lob логическое чтение 0, lob физическое чтение 0, lob read-forward читает 0. === ВЫБРАТЬ В ==== Таблица «XMLTest». Сканирование 1, логическое чтение 3, физическое чтение 1, чтение с опережением 0, lob логическое чтение 300, lob физическое чтение 37, lob read-forward читает 400.
Вопросов
- Почему LOB читает так по-разному?
- Наверняка одни и те же данные читались в каждом тесте?