बड़े सूचकांक INCLUDE फ़ील्ड सिस्टम प्रदर्शन को कैसे प्रभावित करेंगे?


15

यह सवाल एक साथ एसक्यूएल सर्वर सूचकांक प्रदर्शन के बारे में है varchar(2000)एक के रूप में INCLUDEएक कवर सूचकांक में।

मैं धीमी और अस्थिर डेटाबेस एप्लिकेशन में प्रदर्शन को बेहतर बनाने की कोशिश कर रहा हूं। कुछ मामलों में, डेटा की तरह multple स्ट्रिंग कार्यों सहित प्रश्नों के साथ बड़े varchar तार के माध्यम से पहुँचा है, SUBSTRING(), SPACE(), और DATALENGTH()। यहां पहुंच का एक सरल उदाहरण है;

update fattable set col3 =  
   SUBSTRING(col3,1,10) + '*' + 
   SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2

स्कीमा इस तरह दिखता है:

CREATE TABLE [dbo].[FatTable]( 
    [id] [bigint] IDENTITY(1,1) NOT NULL, 
    [col1] [nchar](12) NOT NULL, 
    [col2] [int] NOT NULL, 
    [col3] [varchar](2000) NOT NULL, ... 

निम्नलिखित सूचकांक को बड़े टेक्स्ट कॉलम पर एक कवरिंग फ़ील्ड के साथ परिभाषित किया गया है।

CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable]  ( [col2] ASC ) 
    INCLUDE( [col3] )

मैंने जो पढ़ा है, उससे बड़े डेटा फ़ील्ड्स को एक इंडेक्स में डालना BAD है। मैं कई लेखों को पढ़ रहा हूं, जिनमें http://msdn.microsoft.com/en-us/library/ms190806.aspx शामिल है जो सूचकांक प्रदर्शन पर पेजिंग और डिस्क आकार के प्रभाव पर चर्चा करते हैं। यह कहा जा रहा है, क्वेरी प्लान निश्चित रूप से कवरिंग इंडेक्स का उपयोग करता है। मेरे पास यह निर्धारित करने के लिए पर्याप्त जानकारी नहीं है कि सिस्टम लोड के मामले में वास्तव में यह मेरे लिए कितना महंगा है। मुझे पता है कि कुल मिलाकर, सिस्टम खराब प्रदर्शन कर रहा है, और मुझे चिंता है कि यह मुद्दों में से एक है। प्रशन:

  • क्या इस varchar(2000)कॉलम को सूचकांक में INCLUDEरखना एक अच्छा विचार है?

  • चूंकि INCLUDEखेतों को पत्ती के नोड्स में संग्रहीत किया जाता है, क्या उनके पास बहुत अधिक प्रभाव सूचकांक प्रदर्शन होता है?

अद्यतन: उत्कृष्ट उत्तरों के लिए धन्यवाद! यह कुछ मायनों में एक अनुचित सवाल है - जैसा कि आप लोग कहते हैं, वास्तविक आंकड़ों और प्रोफाइलिंग के बिना कोई पूर्ण सही उत्तर नहीं है। इतने सारे प्रदर्शन के मुद्दे की तरह, मुझे लगता है कि उत्तर "यह निर्भर करता है" है।


वास्तविक मूल्य कब तक हैं? एक VARCHAR(2000)जो आम तौर पर भंडार सिर्फ दस पात्रों एक बात है, एक ठोस 2,000 बाइट्स प्रति रिकॉर्ड कुछ और है।
जॉन ऑफ ऑल ट्रेड्स

बस एक अवलोकन: यहां "गंध" कुछ ऐसा है कि बड़े कॉलम में 1 या तो हो सकता है) मुफ्त पाठ, जिस स्थिति में प्रश्न फिर से लिखने से फुलटैक्स इंडेक्स या 2 का उपयोग करने के लिए लाभ हो सकता है "मानव पठनीय" कोडित डेटा (जैसे, व्यापक बुद्धिमान) कुंजियाँ, एक VIN की तरह) जो अलग-अलग स्तंभों में विभाजित होने या INDEX के साथ परिकलित स्तंभों को जारी रखने में लाभान्वित हो सकती हैं। दूसरे शब्दों में, खुफिया और डेटा परिवर्तनों के प्रवाह को अच्छी तरह से डिज़ाइन नहीं किया गया है।
ग्रीम

1
हाँ #Gememe, यहाँ एक बुरी गंध है - मुझे लगता है कि इसे "विरासत" कहा जाता है। इस डेटाबेस में समस्याओं की एक भीड़ है।
राउल्रुबिन

जवाबों:


14

कभी एक बड़ा शब्द है, लेकिन, सामान्य तौर पर, नहीं, मैं एक INCLUDE में एक varchar (2000) फ़ील्ड नहीं डालूंगा।

और हाँ, जिस तरह से डेटा को पेज स्तर पर संग्रहीत किया जाता है वह सूचकांक के प्रदर्शन को गंभीरता से प्रभावित कर सकता है, यह इस बात पर निर्भर करता है कि सूचकांक का उपयोग कैसे किया जाता है।

बात यह है कि डेटा की अधिक पंक्तियाँ आप एक पृष्ठ में रटना कर सकते हैं, कम पृष्ठों तक पहुँच प्राप्त करना है, आपका सिस्टम जितनी तेजी से भाग के लिए है। वास्तव में एक बड़े कॉलम को जोड़ने का मतलब है कि किसी पृष्ठ पर संग्रहीत कम जानकारी, इसलिए, रेंज सीक या स्कैन की स्थिति में, डेटा को दोबारा प्राप्त करने के लिए अधिक पृष्ठों को पढ़ना होगा, गंभीरता से सामग्री को धीमा करना।

यह सुनिश्चित करने के लिए कि क्या यह आपकी क्वेरी या आपके सिस्टम पर कोई समस्या है, तो आपको रीड्स, विशेषकर उन पेजों की संख्या पर नजर रखनी होगी, जो क्वेरी का उपयोग करते हैं।


धन्यवाद अनुदान। जैसा कि मैंने एक और टिप्पणी का उल्लेख किया है, अच्छी प्रदर्शन जानकारी दुर्लभ है, इसलिए सार प्रश्न। मुझे पृष्ठ आकार प्रदर्शन लागत की निगरानी का अनुभव नहीं है। मेरा कूबड़ यह है कि यह एक समस्या है, यह देखेगा कि क्या मुझे कुछ आँकड़े मिल सकते हैं।
RaoulRubin

1
क्वेरी के लिए आईओ सेट करना आपको बहुत कुछ बताएगा, तार्किक रीड्स एक्सेस किए गए पृष्ठों की संख्या का प्रतिनिधित्व करता है। आप सामान्य प्रदर्शन जानकारी प्राप्त करने के लिए परफ़ॉर्म काउंटर से सेक / रीड के लिए भी निगरानी कर सकते हैं।
२३:२६

6

क्या आप वर्तमान क्लस्टर किए गए इंडेक्स कुंजी की समीक्षा कर सकते हैं, और शायद col2इसके बजाय क्लस्टर इंडेक्स कुंजी बना सकते हैं? इस तरह से आपको डेटा को डुप्लिकेट करने के लिए 'सब कुछ सहित' ('गुच्छेदार सूचकांक हमेशा शामिल हैं)' कवरिंग व्यवहार शामिल हैं। यह, ज़ाहिर है, कई के अधीन है ifऔर but, फिर भी शायद विचार करने योग्य है। बेशक अगर मौजूदा क्लस्टर इंडेक्स एक बाधा (प्राथमिक कुंजी, अद्वितीय) को लागू कर रहा है, तो कहा कि बाधा को गैर-क्लस्टर इंडेक्स में स्थानांतरित करना होगा।


पीके के बारे में आपका सुझाव एक महान विचार है, हालांकि मैं इसे इस मामले में लागू नहीं कर पाऊंगा - मौजूदा पीके अन्य प्रश्नों के लिए आवश्यक है। (यह एक तकनीक है जिसे मैं टूलबॉक्स में
रखूंगा

4

इसका उत्तर देना कठिन है। यह सब आपके पढ़ने: लिखने के अनुपात पर निर्भर करेगा। क्या आपने एक वर्कलोड का परीक्षण किया है या शामिल कॉलम के साथ और उसके बिना एक परीक्षण प्रणाली पर संपूर्ण व्यापार चक्र का अनुकरण किया है? इसके बिना लुकअप में बहुत अधिक खर्च हो सकता है, लेकिन यदि आप डेटा को अधिक बार पढ़ रहे हैं, तो आप इसे ठीक कर सकते हैं।


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

2
और क्या अधिकांश रीड्स वास्तव में इस VARCHAR(2000)कॉलम को खींचते हैं, या आप एक बहुत ही विशिष्ट क्वेरी के प्रदर्शन का निवारण कर रहे हैं जो अधिकांश प्रश्नों का प्रतिनिधित्व नहीं करता है? जैसा कि ग्रांट सुझाव देता है कि यदि इस कॉलम का उपयोग बहुत सारे प्रश्नों में नहीं किया गया है, या वास्तव में इसके लिए समस्याओं का कारण बनता है, तो संभवतः यह आवश्यक होगा कि जब आपको इसकी आवश्यकता हो तो लुकअप के लिए मूल्य का भुगतान करें, लेकिन स्टोरेज के लिए भुगतान न करें जब आप न करें । फिर से, यह बताना वास्तव में कठिन है कि आप किस बाड़ के किनारे पर होना चाहिए, क्योंकि हमारे पास वास्तव में कोई विवरण नहीं है (और यहां तक ​​कि क्योंकि आप परीक्षण नहीं कर सकते हैं - आपको इसे ठीक करने का प्रयास करना चाहिए)।
हारून बर्ट्रेंड

3

मुझे पता है कि मुझे इस पार्टी के लिए देर हो रही है, लेकिन मैं बिल्कुल पंक्तियों को खोजने के लिए इस्तेमाल किए जाने वाले भावों को अनुक्रमित करूंगा, जैसे कि प्रतिस्थापन (col3,10,1)। यदि पूरे col3 का कभी उपयोग किया जाता है, तो मैं CHECKSUM (col3) को अनुक्रमणित करूँगा (यह समझना कि पाठ्यक्रम के टकराव हो सकते हैं)।

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