SQL सर्वर में आँकड़े कहाँ संग्रहीत हैं?


27

क्वेरी ऑप्टिमाइज़र द्वारा उपयोग किए गए आँकड़े SQL सर्वर डेटाबेस फ़ाइल और बफ़र पूल के अंदर भौतिक रूप से कहाँ संग्रहीत किए जाते हैं?

अधिक विशेष रूप से, क्या DMV और / या DBCC का उपयोग करके आँकड़ों द्वारा उपयोग किए गए पृष्ठों का पता लगाने का एक तरीका है?

मैं दोनों SQL Server 2008 इंटरनेशनल और SQL सर्वर इंटर्नल और समस्या निवारण पुस्तकों का मालिक हूं और उनमें से कोई भी आंकड़े की भौतिक संरचना के बारे में बात नहीं करता है; यदि वे करते हैं तो मुझे यह जानकारी नहीं मिल सकती है।


1
जब आप केवल डेटाबेस की एक प्रति बनाते हैं, तो यह बाइनरी दिखाता है STATS_STREAMकि मैंने कभी इस पर ध्यान नहीं दिया कि क्या यह फ़ाइल में कुछ खोजने योग्य है।
मार्टिन स्मिथ

2
आँकड़े एक आंतरिक-केवल कुल फ़ंक्शन ( StatMan) द्वारा निर्मित होते हैं जो एक बूँद (विडंबना यह है कि, एक SSMS क्वेरी विंडो में एक फ़ंक्शन के रूप में नाम हाइलाइट किया गया है)। तार्किक रूप से, आँकड़े, एक सूचकांक या तालिका स्तंभ का एक सेट के साथ जुड़े रहे तो मैं आंतरिक मेटाडाटा टेबल एक की तलाश में परीक्षण करके शुरू होगा binaryया varbinaryस्तंभ ब्लॉब को बढ़ावा मिलेगा। यह देखने योग्य होना चाहिए DBCC PAGE, लेकिन शायद कोई अन्य तरीका नहीं है क्योंकि यह सब आंतरिक है।
जॉन सिगेल

1
@ivanmp मैंने आपके प्रश्न को स्पष्टता के लिए संपादित किया क्योंकि बहुत से नौसिखिया डीबीए में से एक बीपी या एक क्यूओ नहीं है।
मैक्स वर्नन

2
में हुआ करता था, sysindexes.statblobलेकिन 2005 के बाद से यह रिटर्न NULLऔर स्थान पूरी तरह से अनिर्दिष्ट है, केवल पुनर्प्राप्ति योग्य (जो मुझे पता है) के माध्यम से DBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
हारून बर्ट्रेंड

1
अनुक्रमणिका आँकड़े मिले - वे हैं sys.sysidxstats- ऐसा लगता है कि उस तालिका में एक LOB सूचक है। मुझे यकीन नहीं है कि कॉलम के आँकड़े अभी तक कहाँ हैं; वे उस तालिका में हो सकते हैं और साथ ही एक typeकॉलम भी हो सकता है।
जॉन सिगेल

जवाबों:


30

उन्हें मिला।

  1. एक साधारण आँकड़े ऑब्जेक्ट के साथ एक तालिका बनाएँ।

    CREATE DATABASE splunge;
    GO
    USE splunge;
    GO
    CREATE TABLE dbo.foo(bar INT, munge INT);
    GO
    CREATE STATISTICS x ON dbo.foo(bar);
    CREATE STATISTICS y ON dbo.foo(munge);
    GO
    INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
      FROM sys.objects AS s1
      CROSS JOIN sys.objects AS s2;
    GO
    UPDATE STATISTICS dbo.foo;
    GO
  2. DAC ( ADMIN:Server[\instance]) का उपयोग करके कनेक्ट करें ।

  3. निम्न क्वेरी चलाएँ:

    DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
    DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
    
    SELECT name, imageval 
      FROM sys.stats AS s
      INNER JOIN sys.sysobjvalues AS o
      ON s.object_id = o.objid
      AND s.stats_id = o.subobjid
    WHERE 
      s.object_id = OBJECT_ID('dbo.foo');

आप ध्यान देंगे कि imagevalप्रत्येक आँकड़े ऑब्जेक्ट के लिए आँकड़े बूँद के समान नहीं है, लेकिन इसमें आँकड़े बूँद होते हैं - यह सिर्फ ऑफसेट है। मेरे सिस्टम पर एक्स के लिए यह पैदावार हुई (मैंने स्पष्ट रूप से बिट्स का एक छोटा भाग काट दिया है):

0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
                            0x07000000C4E1BE00EEA0...rest the same

और यह y के लिए:

0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
                            0x07000000C7E1BE00EEA0...rest the same

सूचकांक आधारित आँकड़ों के लिए भी यही सच था।

आप संभवतः DBCCकमांड का उपयोग करके प्रश्नों की एक श्रृंखला के साथ इसे आगे सत्यापित कर सकते हैं । सबसे पहले, उन पृष्ठों का पता लगाएं, जिन पर क्लस्टर किए गए सूचकांक के साथ शामिल हैं sys.sysobjvalues(अपने डेटाबेस का नाम बदलें):

DBCC IND('splunge', 'sys.sysobjvalues', 1);

परिणाम पृष्ठों के एक समूह को सूचीबद्ध करेगा, जिनकी आप रुचि रखते हैं PageType = 1। एक नए डेटाबेस के साथ, आपको यह जानकारी उच्चतम PagePIDमानों वाले पृष्ठों में से एक पर मिलनी चाहिए । जैसे मेरे सिस्टम पर यह पृष्ठ २ was१ था, तो मैंने उस पृष्ठ को करीब से देखा:

DBCC TRACEON(3604);

DECLARE @dbid INT = DB_ID();

DBCC PAGE(@dbid, 1, 281, 3);

DBCC TRACEOFF(3604);

यकीन है कि पर्याप्त है, मुझे स्लॉट 17 में डेटा मिला:

DBCC पेज के आंशिक परिणाम

(बड़े डेटाबेस पर, आपको बहुत अधिक शिकार और पेकिंग करनी पड़ सकती है, क्योंकि इस बात की कोई गारंटी नहीं है कि एक नया आँकड़े ऑब्जेक्ट भी एक नए (एर) पृष्ठ पर समाप्त हो जाएगा।)

आगे बढ़ो और घर पर यह कोशिश करो, लेकिन एक कारण है जो आपको इसके लिए डीएसी से जुड़ने की आवश्यकता है। मुझे यह जानने की उत्सुकता होगी कि आप इस जानकारी के साथ क्या करने जा रहे हैं जो आप DBCC SHOW_STATISTICSआउटपुट के साथ नहीं कर सकते ।

ध्यान दें कि यह पाठ्यक्रम STATS_STREAMहिस्टोग्राम या अन्य जानकारी प्रदान करने के लिए डिकोड करने का प्रयास नहीं करता है , और मुझे कोई भी प्रमाण नहीं मिला है कि DBCC SHOW_STATISTICS ... WITH HISTOGRAMतालिका के प्रारूप में कहीं भी सारणीबद्ध आउटपुट संग्रहीत है। जो चांग डिकोडिंग के बारे में कुछ जानकारी है कि क्या आप के बाद कर रहे हैं। मुझे नहीं लगता कि यह ऐसा कुछ है जिसे आप किसी क्वेरी में करना चाहते हैं - बस उपयोग करें DBCC


2
हमारे पास एक विजेता महिला और सज्जन पुरुष हैं। मैं अपनी टोपी आपको सर देता हूं।
ज़ेन

हाहाहा, बधाई और धन्यवाद, सर! चिंता न करें, मैं ऐसा कुछ नहीं कर रहा हूं जो मुझे नहीं करना चाहिए (AKA "बेवकूफ")। यह सिर्फ व्यक्तिगत विकास के लिए है। एक बार मुझे एहसास हुआ कि मुझे इस बारे में कुछ भी पता नहीं चल सकता है। =)
ivanmp

जो चांग के लेख के बारे में, मुझे यह मिल गया जबकि मैं इस के उत्तर की तलाश में था। मैंने पहले ही इसे पढ़ना शुरू कर दिया था। एक बार फिर धन्यवाद। :)
ivanmp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.