यह सवाल एक साथ एसक्यूएल सर्वर सूचकांक प्रदर्शन के बारे में है 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 बाइट्स प्रति रिकॉर्ड कुछ और है।