TinyInt का SQL सर्वर संग्रहण


12

SQL सर्वर में, पंक्ति में 9B के साथ एक स्मालिंट क्यों संग्रहीत किया जाता है। किसी कारण से NULL बिटमैप मास्क के अंत में एक अतिरिक्त एक बाइट लगती है।

    यूएसई टेम्पर्ड;
    जाओ

    टेबल टेबल बनाएं
    (
        मैं नहीं पूरी तरह से नहीं
    );
    जाओ

    INSERT INTO tbl (i)
        वाल्व (1);
    जाओ

    DBCC IND ('tempdb', 'tbl', - 1);
    जाओ

    DBCC TRACEON (3604); - पेज डंप कंसोल जाएगा
    जाओ

    DBCC PAGE ('tempdb', 1,168,3);
    जाओ

परिणाम (मैंने DBCC पृष्ठ के पहले सबसे महत्वपूर्ण बाइट दिखाने के कारण बाइट्स को उलट दिया):

Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count = 0x0001 = 2B
NULL Bitmap = 0x0000 = 2B (what!?)

1
क्या यह सिर्फ शैक्षिक है? जहाँ आवश्यक हो, मैं ट्रिमिंग स्पेस के लिए हूँ, लेकिन यह शायद 1 बाइट नहीं है जिसके बारे में मैं चिंतित होने जा रहा हूँ ...
हारून बर्ट्रेंड

यह शैक्षिक है। मेरी अगली SQLSaturday कंप्रेसिन पर बात है; इसलिए, मैंने प्रत्येक डेटा प्रकार के लिए लोगों को उनके डेटा प्रकार विकल्पों के निहितार्थ को समझने और उनके डेटा प्रकारों पर संपीड़न के प्रभाव को दिखाने के लिए उदाहरण तैयार किए हैं।

मैंने मान लिया कि टिनींट को 7B ओवरहेड के साथ 1B (यह है) के रूप में संग्रहीत किया जाएगा। मुझे आश्चर्य है कि अतिरिक्त बाइट रिकॉर्ड के अंत में क्या है ???
११:१२ बजे

जब TINYINT स्तंभ तालिका में एकमात्र स्तंभ नहीं है, तो मुझे अलग-अलग परिणाम दिखाई देते हैं (हालांकि यह सुनिश्चित नहीं है कि वे आपके अपेक्षा के अनुरूप अधिक हैं)। एक बहुत दुर्लभ उपयोग के मामले की तरह लगता है।
हारून बर्ट्रेंड

निश्चित रूप से उपयोग के मामले की सामान्य चिंता नहीं है। मैं केवल एक डेटा प्रकार को दिखाने का प्रयास कर रहा था कि घर में स्टोरेज में शामिल दोनों ओवरहेड लागत को ड्राइव करने के लिए और शुरुआती को यह देखने के लिए कि कॉलम पेज पर कैसा दिखता है। मुझे यह अतिरिक्त बाइट के लिए अजीब लगता है ... मुझे वहाँ और बिना कारण देखने के लिए पागल हो जाता है।

जवाबों:


12

यदि आप सरल आकार जोड़कर रिकॉर्ड की गणना करते हैं तो आपको वास्तव में 8: 4 + 1 + 2 + 1 (शीर्षलेख + निश्चित आकार + शून्य बिटमैप गणना + शून्य बिटमैप) प्राप्त होता है। लेकिन एक ढेर रिकॉर्ड अग्रेषित ठूंठ के आकार से छोटा नहीं हो सकता है , जो कि 9 बाइट्स है, क्योंकि रिकॉर्ड को यह गारंटी देनी चाहिए कि इसे एक अग्रेषण ठूंठ के साथ बदला जा सकता है। इसलिए, रिकॉर्ड वास्तव में 9 बाइट्स होगा। A smallint, गणना और न्यूनतम आकार के माध्यम से 9 बाइट्स होगा। कुछ भी बड़ा पहले से ही अग्रेषित ठूंठ से बड़ा है, इसलिए आपकी गणना आकार रिकॉर्ड आकार से मेल खाती है।


9 बाइट्स भी इस परिभाषा पर लागू होती हैं, CREATE TABLE tbl (i TINYINT NOT NULL PRIMARY KEY)तो क्या यह सभी पंक्तियों के लिए एक सामान्य नियम है कि वे एक ढेर का हिस्सा हैं या नहीं?
मार्टिन स्मिथ

1
बी-वृक्ष एक ढेर (के रूप में तब्दील किया जा सकता है alter table ... drop constraint) और ऑपरेशन नहीं है एक पूर्ण पुनर्निर्माण (ख-वृक्ष ऊपरी पृष्ठों फेंक दिया हो, पत्ती पृष्ठों छोड़ दिया अनलिंक करने और परिणाम है ढेर) तो आरक्षण तर्क अभी भी लागू होता ।
रेमुसु रानू

मुझे लगता है कि यह साबित करता है कि रेमस ने क्या कहा है ...
सुधरने के लिए

6

लेखक का कान होना अच्छा है। :-) कालेन को संदेह है कि यह किसी प्रकार की न्यूनतम पंक्ति की लंबाई का प्रवर्तन है, जहां कुछ भी <9 को 9 पर रखा जाता है। बेशक कुछ ही मामले हैं जहां यह संभव है। आपको यह फैंटम बाइट TINYINT और BIT के साथ-साथ VARCHAR (1) / CHAR (1) के लिए मिलेगा। यदि आप SMALLINT या CHAR (2) में जाते हैं तो यह 9 से अधिक नहीं बढ़ेगा, लेकिन यदि आप CHAR (3) कहते हैं, तो यह बढ़ जाएगा।

इसलिए अनिवार्य रूप से आप उन दक्षताओं को इंगित कर सकते हैं जो आप डेटा प्रकारों को बुद्धिमानी से चुनकर प्राप्त कर सकते हैं, लेकिन इंगित करें कि कुछ किनारे मामले हैं जहां भंडारण परत में अन्य कारकों के कारण नियम नहीं हैं।

EDIT मुझे आशा है कि आपके लिए और ठोस जानकारी होगी। बस आपको यह बताने की इच्छा है कि यह वही है जो वर्तमान में इंटर्न्स पुस्तक के लेखक को लगता है। वह 100% निश्चित नहीं है।


कालेन तक पहुंचने के लिए आरोन का शुक्रिया। मैं कल रात उस किताब के माध्यम से खुदाई कर रहा था और अपने बाल खींच रहा था। यह sql_variant के लिए अतिरिक्त मेटाडेटा बाइट्स की तरह है। यहां मेरे पास हाथ से लहराते और चिल्लाते हुए "जिस तरह से यह पैल है!"
ooutwire

1
अच्छी तरह से आप यह टिप्पणी कर सकते हैं कि "यह एक चरम बढ़त का मामला है, क्योंकि प्रत्येक पंक्ति में एक एकल टिंटिंट या चार (1) को संग्रहीत करने की कोशिश करने के लिए कई टेबल नहीं बनाए गए हैं।"
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.