2010-04-04 17 views
7

मैंने पढ़ा है कि एसक्यूएल सर्वर में टेबल इंडेक्स जोड़ने के लिए ट्रेडऑफ में से एक चुनिंदा प्रश्नों के प्रदर्शन को लाभ पहुंचाने के लिए सम्मिलित/अद्यतन/हटाए गए प्रश्नों की बढ़ी हुई लागत है।एसक्यूएल सर्वर इंडेक्स लागत

मैं अवधारणात्मक रूप से समझ सकता हूं कि किसी सम्मिलन के मामले में क्या होता है क्योंकि SQL सर्वर को नई पंक्तियों से मेल खाने वाली प्रत्येक अनुक्रमणिका में प्रविष्टियां लिखनी पड़ती हैं, लेकिन अपडेट और डिलीट मेरे लिए थोड़ा और अस्पष्ट है क्योंकि मैं काफी लपेट नहीं सकता डेटाबेस इंजन को क्या करना है इसके चारों ओर सिर।

के एक उदाहरण के रूप DELETE लेने के लिए और यह मान रहा निम्न स्कीमा (क्षमा छद्म एसक्यूएल)

TABLE Foo 
col1 int 
,col2 int 
,col3 int 
,col4 int 
PRIMARY KEY (col1,col2) 

INDEX IX_1 
col3 
INCLUDE 
col4 

अब है, अगर मैं बयान जारी

DELETE FROM Foo WHERE col1=12 AND col2 > 34 

मैं क्या इंजन को समझें तालिका को अद्यतन करने के लिए करना चाहिए (या अगर आप पसंद करते हैं तो क्लस्टर्ड इंडेक्स)। इंडेक्स को पंक्तियों की सीमा को हटाने और इसे करने में आसान बनाने के लिए सेट अप किया गया है।

हालांकि, इस बिंदु पर इसे IX_1 को अपडेट करने की आवश्यकता है और मैंने जो क्वेरी दी है, वह डेटाबेस इंजन को अपडेट करने के लिए पंक्तियों को खोजने का कोई स्पष्ट तरीका नहीं देता है। क्या इस बिंदु पर इसे एक पूर्ण इंडेक्स स्कैन करने के लिए मजबूर किया गया है? क्या इंजन पहले क्लस्टर इंडेक्स से पंक्तियों को पढ़ता है और इंडेक्स के खिलाफ एक स्मार्ट आंतरिक डिलीट उत्पन्न करता है?

अगर मुझे हुड के नीचे क्या चल रहा है, तो मुझे यह समझने में मदद मिल सकती है, लेकिन मुझे लगता है कि मेरा असली सवाल यह है। मेरे पास एक डेटाबेस है जो हटाने में काफी समय व्यतीत कर रहा है और मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं इसके बारे में क्या कर सकता हूं।

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

क्या वे सभी इस मामले में बराबर हैं? क्या कोई तरीका है कि मैं वास्तव में कोशिश करने के बिना इन सूचकांकों में से एक या अधिक को हटाने के प्रभाव का अनुमान लगा सकता हूं?

उत्तर

3

Nonclustered अनुक्रमणिका भी store the clustered keys
यह एक पूर्ण स्कैन करने के लिए नहीं है के बाद से:

  • आपकी क्वेरी पंक्तियों
  • पंक्तियों अन्य सूचकांक मूल्य (C3)
  • अन्य सूचकांक मूल्य का उपयोग कर शामिल पता लगाने के लिए क्लस्टर सूचकांक का उपयोग करेगा (सी 3) और क्लस्टर सूचकांक मान (सी 1, सी 2), यह अन्य सूचकांक में मिलान प्रविष्टियों का पता लगा सकता है।

(नोट: मैं मुसीबत डॉक्स की व्याख्या की थी, लेकिन मैं कल्पना है कि जैसे कि वह भी, सी 2 C1 पर हल कर रहा था अपने मामले में IX_1 में परिभाषित किया जा सकता है के बाद से इन पहले से ही सूचकांक में जमा हो जाती है, यह होगा। उदाहरणों और अद्यतनों के लिए रिकॉर्ड्स का अधिक कुशलतापूर्वक पता लगाने के लिए उनका उपयोग करने के लिए सही अर्थ बनाएं।)

यह सब, हालांकि लागत है।

  • यह पंक्ति को पढ़ने के लिए है, सी 3 के लिए मूल्य पता लगाने के लिए
  • इसके लिए (सी 3, C1, C2) nonclustered अनुक्रमणिका में
  • प्रविष्टि को खोजने के लिए है यह: प्रत्येक पंक्ति के लिए मिलान वहां से प्रविष्टि को भी हटाना होगा।

इसके अलावा, जबकि रेंज क्वेरी आपके मामले में क्लस्टर सूचकांक पर कुशल हो सकता है के लिए उन्हें को, रैंडम एक्सेस में अन्य अनुक्रमित के रखरखाव के सबसे अधिक संभावना होगा परिणाम (रेखीय का उपयोग, एक मैच पाने के बाद) प्रत्येक मिलान पंक्ति। किसी दिए गए मैच से शुरू होने वाले B+ tree पत्ते नोड्स की तुलना में यादृच्छिक पहुंच की तुलना में बहुत अधिक लागत है।
उपरोक्त क्वेरी को देखते हुए, गैर-क्लस्टर इंडेक्स रखरखाव पर अधिक समय व्यतीत किया जाता है - राशि col1 = 12 AND col2 > 34 द्वारा चुने गए रिकॉर्ड्स की संख्या पर भारी निर्भर करती है।

मेरा अनुमान है कि लागत वैचारिक रूप से वही है जैसे आपके पास द्वितीयक अनुक्रमणिका नहीं थी लेकिन उदा। क्लस्टर कुंजी में एकमात्र कॉलम के रूप में एक अलग तालिका, होल्डिंग (सी 3, सी 1, सी 2) और आपने प्रत्येक मिलान पंक्ति के लिए DELETE (सी 3, सी 1, सी 2) किया है। जाहिर है, इंडेक्स रखरखाव एसक्यूएल सर्वर के लिए आंतरिक है और तेजी से है, लेकिन अवधारणात्मक रूप से, मुझे लगता है कि उपरोक्त करीब है।

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

यदि आपको हटाए गए रिकॉर्ड्स की संख्या के आधार पर इंडेक्स, प्रदर्शन-वार की आवश्यकता है, तो आप डिलीट को शेड्यूल करना बेहतर कर सकते हैं, इंडेक्स को छोड़ सकते हैं - जिन्हें हटाए जाने से पहले उपयोग नहीं किया जाता है - उन्हें हटाने से पहले और उन्हें वापस जोड़ना बाद। प्रभावित रिकॉर्ड की संख्या के आधार पर, indexes might be faster का पुनर्निर्माण।

+0

प्रत्येक इंडेक्स को लॉक करने की लागत के शीर्ष पर जोड़ें। लॉकिंग के उद्देश्य के लिए, प्रत्येक सूचकांक एक अलग संसाधन है। –

+0

@KNoodles: वास्तव में, लॉकिंग अतिरिक्त ओवरहेड पेश करता है। (यद्यपि कई अच्छे अनाज वाले लॉक ऑपरेशन हो रहे हैं, लेकिन बाकी ऑपरेशन के लिए ओवरहेड से बचने के लिए उन्हें एक बड़े लॉक के लिए मजबूर किया जा सकता है।) –

संबंधित मुद्दे