นี่คือการทดสอบสามแบบที่อ่านข้อมูลเดียวกัน แต่รายงานการอ่านเชิงตรรกะที่แตกต่างกันมาก:
ติดตั้ง
สคริปต์ต่อไปนี้สร้างตารางทดสอบที่มี 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, โลจิคัล lob อ่าน 795, lob ฟิสิคัลอ่าน 37, lob read-ahead อ่าน 796 === กำหนดให้กับตัวแปร ==== ตาราง 'XMLTest' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 3, การอ่านทางกายภาพ 1, การอ่านล่วงหน้าอ่าน 0, โลจิคัล lob อ่าน 0, lob ฟิสิคัลอ่านเป็น 0, lob read-ahead อ่าน 0 === เลือกเข้าสู่ ==== ตาราง 'XMLTest' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 3, การอ่านทางกายภาพ 1, การอ่านล่วงหน้าอ่าน 0, lob ลอจิกอ่าน 300, ลูกเทนนิสกายภาพอ่าน 37, lob read-ahead อ่าน 400
คำถาม
- เหตุใด LOB จึงอ่านแตกต่างกันมาก
- แน่นอนข้อมูลเดียวกันที่ถูกอ่านในการทดสอบแต่ละครั้ง?