एक ही LOB डेटा तक पहुँचने पर तार्किक भिन्न होता है


26

यहां तीन सरल परीक्षण हैं जो एक ही डेटा को पढ़ते हैं, फिर भी बहुत भिन्न तार्किक रीड को रिपोर्ट करते हैं:

सेट अप

निम्न स्क्रिप्ट 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 कॉलम पढ़ें :

  1. एक सादा SELECTबयान
  2. Xml को एक वेरिएबल पर असाइन करना
  3. 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 पढ़ता है।

प्रशन

  • एलओबी क्यों इतने अलग हैं?
  • निश्चित रूप से प्रत्येक परीक्षण में सटीक एक ही डेटा पढ़ा गया था?

जवाबों:


27

सभी रीड समान नहीं हैं। SQL सर्वर जानता है कि LOB डेटा एक्सेस करना महंगा है, और जब संभव हो तो इससे बचने की कोशिश करता है। प्रत्येक मामले में LOB डेटा को पढ़ने के तरीके में विस्तृत अंतर हैं:

सारांश

संख्या भिन्न हैं क्योंकि:

  • चयन पैकेट-आकार के चक्रों में LOB को पढ़ता है
  • चर असाइनमेंट परीक्षण में एलओबी बिल्कुल नहीं पढ़ा जाता है
  • "चयन में" परीक्षण पूरे पृष्ठों में LOB को पढ़ता है

विस्तार

  1. मैदान SELECT

    प्लान का चयन करें

    Clustered Index Scan कोई LOB डेटा नहीं पढ़ता है। यह केवल एक स्टोरेज इंजन LOB हैंडल प्रदान करता है । नियंत्रण का उपयोग तब तक नहीं किया जाता है जब तक कि योजना की जड़ पर नियंत्रण वापस नहीं आ जाता है।

    वर्तमान पंक्ति की LOB सामग्री टीडीएस पैकेट आकार के विखंडू में पढ़ी जाती है और ग्राहक को दी जाती है। तार्किक पढ़ता है कि पृष्ठ को कितनी बार छुआ गया है, गिनें:

    रिपोर्ट किए गए रीड्स की संख्या प्रदर्शन किए गए रद्दी की संख्या के बराबर होती है, साथ ही हर बार एक एलओबी पेज संक्रमण होने पर भी।

    उदाहरण के लिए: एक तार्किक रीड को प्रत्येक चंक की शुरुआत में गिना जाता है क्योंकि प्रक्रिया धारा की वर्तमान स्थिति के अनुरूप पृष्ठ को छूती है। जहां पैकेट एक डेटाबेस पेज (सामान्य मामला) से छोटा होता है, उसी पृष्ठ के लिए कई तार्किक रीड गिने जाते हैं। यदि पैकेट का आकार इतना बड़ा होता कि पूरा एलओबी एक ही हिस्से में फिट हो सकता है, तो रिपोर्ट की गई तार्किक रीड की संख्या एलओबी पेजों की संख्या होगी।

  2. परिवर्तनशील कार्य

    परिवर्तनीय योजना

    Clustered Index Scan पहले की तरह एक LOB हैंडल असाइन करता है । योजना के मूल में, LOB हैंडल को वैरिएबल में कॉपी किया जाता है। LOB डेटा स्वयं कभी एक्सेस नहीं किया जाता है (शून्य LOB पढ़ता है), क्योंकि चर कभी पढ़ा नहीं जाता है। अगर ऐसा था भी, तो यह केवल पिछले असाइन किए गए LOB हैंडल के माध्यम से होगा।

    कोई LOB नहीं पढ़ता है क्योंकि LOB डेटा कभी एक्सेस नहीं किया जाता है।

  3. SELECT INTO

    योजना में चयन करें

    यह योजना स्रोत तालिका से नई तालिका में LOB डेटा की प्रतिलिपि बनाने के लिए बल्क रूसेट प्रदाता का उपयोग करती है। यह प्रत्येक रीड (कोई स्ट्रीमिंग या चैंकिंग) पर एक पूर्ण एलओबी पेज को संसाधित करता है।

    तार्किक तालिका की संख्या परीक्षण तालिका में LOB पृष्ठों की संख्या से मेल खाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.