यहां तीन सरल परीक्षण हैं जो एक ही डेटा को पढ़ते हैं, फिर भी बहुत भिन्न तार्किक रीड को रिपोर्ट करते हैं:
सेट अप
निम्न स्क्रिप्ट 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 पढ़ता है।
प्रशन
- एलओबी क्यों इतने अलग हैं?
- निश्चित रूप से प्रत्येक परीक्षण में सटीक एक ही डेटा पढ़ा गया था?