क्या "पंक्ति से बाहर" फ़ील्ड तब पढ़ी जाती हैं जब एक क्लस्टर इंडेक्स का उपयोग किया जाता है?


10

मुझे पता है कि जब VARCHAR(MAX)/NVARCHAR(MAX)स्तंभों का उपयोग किया जाता है तो डेटा संग्रहीत किया जाता है out of the row- डेटा पंक्ति में किसी अन्य स्थान पर एक पॉइंटर होगा जहां 'बड़ा मूल्य' संग्रहीत होता है।

मेरे पास निम्नलिखित प्रश्न हैं:

  1. क्या प्रत्येक क्षेत्र संग्रहीत है out of the rowया केवल maxहैं?
  2. यदि आप clustered indexपूरे रिकॉर्ड को पढ़ने के लिए तालिका का उपयोग कर रहे हैं , तो क्या फ़ील्ड को पंक्ति से बाहर संग्रहित किया जाता है, भी?

VARCHAR (MAX) या NVARCHAR (MAX) को 'बड़े मूल्य प्रकार' के रूप में माना जाता है। बड़े मूल्य प्रकार आमतौर पर 'आउट ऑफ रो' संग्रहीत होते हैं। इसका मतलब है कि ...


2
वह अंतिम उद्धृत बिट कहां से आया है? यह सही नहीं है।
पॉल व्हाइट 9


3
मूल MSDN थ्रेड (याकूब सेबेस्टियन द्वारा) में पूरा पाठ सही है। स्टैक ओवरफ्लो "बोली" काफी हद तक खो देता है। इस बात का छोटा सा अंश आप को छोड़ देता है ऊपर उद्धृत सभी महत्वपूर्ण बिट्स :)
पॉल व्हाइट 9

जवाबों:


13

मुझे पता है कि जब VARCHAR(MAX)/NVARCHAR(MAX)कॉलम का उपयोग किया जाता है तो डेटा पंक्ति से बाहर संग्रहीत किया जाता है ...

दरअसल, यह large value types out of rowविकल्प की सेटिंग पर निर्भर करता है , जिसका उपयोग करके सेट किया जा सकता है sp_tableoption। से प्रलेखन :

BOL अर्क

डिफ़ॉल्ट के लिए है MAXमान संग्रहीत करने के लिए इन-पंक्ति , 8000 बाइट्स, ऊपर अगर वे फिट। जब तक आपने sp_tableoptionडिफ़ॉल्ट को बदलने के लिए उपयोग नहीं किया है, तब तक आपका MAXडेटा सबसे अधिक बार पंक्ति में संग्रहीत किया जाएगा।

उस ने कहा, MAXमानों के लिए डेटा प्रकारों का उपयोग करना खराब अभ्यास है जो कभी भी 8000 बाइट्स से अधिक नहीं होगा - इसके बजाय एक गैर-मैक्स प्रकार का उपयोग करें। किसी अन्य चीज़ के अलावा, प्रदर्शन अक्सर MAXप्रकारों के साथ काम करते समय काफी खराब होता है , क्योंकि SQL सर्वर को डेटा से निपटने के लिए तैयार रहना चाहिए जो कि आकार में 2GB तक हो सकता है।

क्या प्रत्येक क्षेत्र पंक्ति से बाहर है या केवल अधिकतम हैं?

केवल MAXलोगों को। इसके अलावा, यदि कोई पूर्व-पंक्ति MAXस्तंभ बंद पंक्ति में ले जाया जाता है, तो केवल उस पंक्ति में वह स्तंभ प्रभावित होता है। इसे पॉइंटर से ऑफ-रो LOBसंरचना में प्रतिस्थापित किया जाता है । ऐसी परिस्थितियां भी होती हैं, जहां गैर-मैक्स कॉलम को ऑफ-रो ले जाया जा सकता है।

यदि आप पूरे रिकॉर्ड को पढ़ने के लिए तालिका के क्लस्टर किए गए इंडेक्स का उपयोग कर रहे हैं, तो क्या फ़ील्ड को पंक्ति से बाहर संग्रहित किया गया है, भी पढ़ें?

क्लस्टर किए गए अनुक्रमणिका को स्कैन करना केवल इन-पंक्ति डेटा को ट्रैवर्स करता है। यदि क्वेरी के लिए ऑफ-रो डेटा आवश्यक है, तो इन-रो पॉइंटर का उपयोग करके इसे देखा जाता है।


क्या यह हमेशा सच है - Scanning the clustered index traverses only in-row data.? उदाहरण के लिए, यदि आप NVARCHAR(MAX)फ़ील्ड मान प्रदर्शित करना चाहते हैं तो केवल in-row-data(यदि मान पंक्ति से बाहर संग्रहीत हैं) के साथ काम करना कैसे संभव है ? या जब आप क्लस्टर किए गए इंडेक्स का उपयोग कर रहे हैं (क्योंकि कोई कवरिंग इंडेक्स नहीं है), लेकिन आप workउस NVARCHAR(MAX)फ़ील्ड के साथ नहीं जा रहे हैं जो SQL सर्वर देखने के लिए काफी चतुर है और out-of-rowडेटा को देखने को छोड़ देता है ?
गत

जवाब के लिए धन्यवाद। तो, अंत में, यदि आप दो कॉलम है - intऔर nvarchar(max)और आप केवल चयन कर रहे हैं intस्तंभ, एसक्यूएल-सर्वर से संसाधन बर्बाद नहीं करता है डेटा के रूप में यह जानता है कि आप इसे उपयोग करने के लिए नहीं जा रहे हैं? readout-of-row
gotqn

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

3
@ तगान हाँ। पुराने LOB प्रकारों के लिए ऑफ-पंक्ति डिफ़ॉल्ट थी text, ntextऔर image। आप निश्चित रूप से एक अलग तालिका में बड़े प्रकारों को संग्रहीत कर सकते हैं।
पॉल व्हाइट 9

4

बड़ी वस्तुओं के भंडारण के लिए इस व्यवहार को तालिका सेटिंग द्वारा नियंत्रित किया जा सकता है:

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

: SQL Server 2012 दस्तावेज में संदर्भ में है http://msdn.microsoft.com/en-us/library/ms173530.aspx

इसलिए आप उस स्थान को नियंत्रित कर सकते हैं जहां अंतरिक्ष का उपयोग किया जाता है, पंक्ति में या पंक्ति से बाहर संग्रहीत किया जाता है।


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