अपडेट स्टेटमेंट पर एक इंडेक्स का प्रभाव जहां अपडेट कॉलम इंडेक्स में नहीं है


16

मैं लगातार देखता हूं कि लोग कहते हैं कि इंडेक्स धीमा हो जाता है update, deleteऔर insert। यह एक कंबल बयान के रूप में प्रयोग किया जाता है, जैसे कि यह एक पूर्ण है।

प्रदर्शन में सुधार करने के लिए अपने डेटाबेस को ट्यून करते समय, मैं इस स्थिति में आता रहता हूं जो कि मेरे लिए तार्किक रूप से उस नियम का खंडन करता प्रतीत होता है, और कहीं भी मैं किसी को भी किसी भी तरह से कह या समझा नहीं सकता।

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

यदि मेरे पास ऐसे कॉलम हैं जो किसी भी इंडेक्स पर शामिल नहीं हैं और मैं उन्हें अपडेट करता हूं, तो क्या वे सिर्फ इसलिए धीमा हो जाते हैं क्योंकि मेरे पास उस टेबल के अन्य कॉलम पर एक इंडेक्स है?

एक उदाहरण के रूप में, मेरी Userतालिका में कहें कि मेरे पास एक या दो इंडेक्स हैं, प्राथमिक कुंजी जो एक पहचान / ऑटो वृद्धि कॉलम है, और संभवतः कुछ विदेशी कुंजी कॉलम पर एक और है।
यदि मैं सीधे उस पर अनुक्रमणिका के बिना एक स्तंभ अपडेट करता हूं, जैसे कि उनका फ़ोन नंबर या पता, क्या यह अद्यतन धीमा है क्योंकि मेरे पास किसी भी स्थिति में अन्य स्तंभों पर इस तालिका पर अनुक्रमित है? जो कॉलम मैं अपडेट कर रहा हूं, वे इंडेक्स में नहीं हैं, इसलिए तार्किक रूप से, इंडेक्स को अपडेट नहीं किया जाना चाहिए, क्या उन्हें नहीं करना चाहिए? अगर कुछ भी हो, तो मुझे लगता है कि अगर मैं WHERE क्लॉज में अनुक्रमित का उपयोग करता हूं तो उन्हें ऊपर उठा दिया जाता है।


so there is no way they will not affect the indexसिवाय फ़िल्टर्ड इंडेक्स के ...
usr

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

जवाबों:


6

आप सही हैं कि एक गैर-अनुक्रमित कॉलम को अपडेट करने से इंडेक्स में परिवर्तन नहीं होगा। एक साधारण मामले में, तालिका पर कोई समग्र प्रभाव नहीं होगा।

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

बेशक, डेटा के अधिक मात्रा वाले स्तंभ को अपडेट करने से कुछ पंक्तियों को अलग-अलग पृष्ठों पर ले जाया जा सकता है, वगैरह-वगैरह।


1
SQL सर्वर ओपी में उल्लेख किया गया है, मैंने एक टैग जोड़ा है, इसलिए मुझे लगता है कि आप SQL सर्वर
टॉम V -

10

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

आप इस धारणा में सही हैं कि कई प्रश्नों के लिए उपयोगी अनुक्रमितों की उपस्थिति के परिणामस्वरूप बहुत ध्यान देने योग्य गति में सुधार होगा।

यद्यपि आपका प्रश्न प्रदर्शन के आसपास प्रतीत होता है, लेकिन अनुक्रमणिका को जोड़ने के इर्द-गिर्द कई अन्य संभावित मुद्दे हैं, जिनमें शामिल हैं:

  1. सूचकांक बनाने में लगने वाले समय में अवरोध उत्पन्न हो सकता है जबकि सूचकांक तालिका में जोड़ा जाता है। ताला बहुत कम रहता है, और सबसे अधिक संभावना एक बड़ी समस्या नहीं होगी।

  2. अनुक्रमणिका परिवर्तन के परिणामस्वरूप निष्पादन योजनाएँ अंतर्निहित तालिका को संदर्भित करने वाली किसी भी योजना के लिए अमान्य हो जाती हैं। जब उन निष्पादन योजनाओं को फिर से शुरू किया जाता है, तो प्रदर्शन कुछ प्रश्नों के लिए नकारात्मक रूप से बदल सकता है।

  3. सूचकांक संशोधनों से उन त्रुटियों को वापस किया जा सकता है जहां पहले कोई नहीं लौटाया गया था। फ़िल्टर किए गए अनुक्रमणिका के मामले को लें, जिसका उपयोग किसी varchar फ़ील्ड में निहित दिनांक को वापस करने के लिए किया गया था; यदि फ़िल्टर किसी भी पंक्तियों को समाप्त करता है जो दिनांक नहीं थे, और उस फ़िल्टर को बाद में बदल दिया गया है, तो उस सूचकांक पर निर्भर रहने वाले प्रश्न अब गैर-डेट डेटा को बदलने का प्रयास करते समय विफल हो सकते हैं।

  4. एक नया सूचकांक निष्पादन के क्रम को बदलने का कारण बन सकता है जिसके परिणामस्वरूप संभव गतिरोध उत्पन्न होता है जहां पहले गैर हुआ।


"जब अनुक्रमणिका प्रभावित होने वाली नहीं है तब भी अपडेट के लिए आवश्यक कोड पथ का मूल्यांकन किया जाना आवश्यक है" यह सच नहीं है। संकलन / अनुकूलन चरण को अच्छी तरह से पता होगा कि अनुक्रमित को अपडेट करने की आवश्यकता है, यदि कोई हो, और तदनुसार योजना का निर्माण करेगा। अनुक्रमणिका (INCLUDE और क्लस्टर किए गए कुंजी स्तंभों सहित) में एक अद्यतन कथन (SET सूची में कॉलम) को संशोधित नहीं करता है, उस सूचकांक को अपडेट नहीं करना पड़ेगा और निष्पादन चरण भी इसे स्पर्श नहीं करेगा। DELETE और INSERT स्पष्ट रूप से सभी कॉलम (तार्किक रूप से) को छूते हैं और सभी इंडेक्स को अपडेट करना होता है।
रेमस रुसानु

@RemusRusanu लेकिन क्या इसका मूल्यांकन करने की आवश्यकता नहीं होगी यदि सूचकांक का उपयोग उन पंक्तियों का पता लगाने के लिए किया जा सकता है जिन्हें अद्यतन करने की आवश्यकता है?
टॉम वी -

@RemusRusanu - मुझे लगता है कि क्यूओ द्वारा एक योजना तैयार करने के बाद, अधिक सीपीयू की आवश्यकता नहीं है; हालांकि योजना को संकलित करने के लिए निश्चित रूप से ऐसा करने की आवश्यकता है। यदि योजनाएँ बार-बार संकलित हो रही हैं तो इससे बहुत मामूली अंतर आ सकता है।
मैक्स वर्नोन

@TomV डिलीट / अपडेट उम्मीदवार रो का पता लगाने के लिए इंडेक्स का उपयोग करना एक पूरी तरह से अलग विषय है। यदि ऐसा है, तो एक सूचकांक के माध्यम से पंक्तियों को पता लगाने के फायदे किसी भी अनुरक्षण रखरखाव लागत के मुद्दों को दबाना चाहिए।
रेमस रुसानु

@MaxVernon मैं तर्क दूंगा कि DML (UPDATE) के बार-बार होने वाले पुनर्मूल्यांकन का कोई मान्य परिदृश्य नहीं है। मैं कुछ मामलों को वैध (अपरिहार्य) के लिए खरीदता हूं , तदर्थ क्वेरी के लिए पुनर्मिलन। लेकिन डीएमएल? किस तरह का ऐप ऐड-हॉक, अद्वितीय अद्यतन स्टेटमेंट बना सकता है? डीएमएल के साथ बार-बार होने वाले पुनर्मिलन जोर से रोते हैं "मुझे पैरामीटर"।
रेमस रुसानु

-2

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

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