Oto trzy proste testy, które odczytują te same dane, ale raportują bardzo różne logiczne odczyty:
Ustawiać
Poniższy skrypt tworzy tabelę testową ze 100 identycznymi wierszami, z których każdy zawiera kolumnę xml z wystarczającą ilością danych, aby upewnić się, że jest przechowywana poza wierszem. W mojej testowej bazie danych długość wygenerowanego pliku XML wynosi 20 204 bajtów na każdy wiersz.
-- 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;
Testy
Poniższe trzy testy odczytują kolumnę xml za pomocą:
- Proste
SELECT
stwierdzenie - Przypisywanie xml do zmiennej
- Używanie
SELECT INTO
do tworzenia tabeli tymczasowej
-- 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;
Wyniki
Dane wyjściowe to:
=== Zwykły WYBIERZ ==== Tabela „XMLTest”. Liczba skanów 1, odczyty logiczne 3, odczyty fizyczne 1, odczyty z wyprzedzeniem 0, lob logiczne odczytuje 795, lob fizyczne odczytuje 37, lob odczytuje z wyprzedzeniem 796. === Przypisz do zmiennej ==== Tabela „XMLTest”. Liczba skanów 1, odczyty logiczne 3, odczyty fizyczne 1, odczyty z wyprzedzeniem 0, lob logiczne odczytuje 0, lob fizycznie odczytuje 0, lob odczytuje z wyprzedzeniem 0. === WYBIERZ NA ==== Tabela „XMLTest”. Liczba skanów 1, odczyty logiczne 3, odczyty fizyczne 1, odczyty z wyprzedzeniem 0, lob logiczne odczytuje 300, lob fizyczne odczytuje 37, lob odczytuje z wyprzedzeniem 400.
pytania
- Dlaczego odczyty LOB są tak różne?
- Z pewnością w każdym teście czytano dokładnie te same dane?