Ось три прості тести, які читають однакові дані, але повідомляють про дуже різні логічні зчитування:
Налаштування
Наступний скрипт створює тестову таблицю зі 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;
Результати
Вихід:
=== Звичайний ВИБІР ==== Таблиця "XMLTest". Кількість сканувань 1, логічне зчитування 3, фізичне зчитування 1, читання вперед - 0, Логічне логічне зчитування 795, лоб фізичне зчитування 37, лоб зчитування вперед - 796. === Призначення змінної ==== Таблиця "XMLTest". Кількість сканувань 1, логічне зчитування 3, фізичне зчитування 1, читання вперед - 0, Логічне зчитування 0, лобічне фізичне зчитування 0, лобічне зчитування вперед - 0. === ВИБІР ВІД ==== Таблиця "XMLTest". Кількість сканувань 1, логічне зчитування 3, фізичне зчитування 1, читання вперед - 0, Логічне зчитування 300, лобічне фізичне зчитування 37, лоб зчитування вперед - 400.
Запитання
- Чому LOB читає настільки різні?
- Напевно в кожному тесті були прочитані такі самі дані?