डाटाबेस इंडेक्स: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 2: Line 2:
डेटाबेस इंडेक्स [[डेटा संरचना]] है जो इंडेक्स डेटा संरचना को बनाए रखने के लिए अतिरिक्त राइट्स और स्टोरेज स्पेस की मूल्य पर [[तालिका (डेटाबेस)]] पर डेटा पुनर्प्राप्ति संचालन की गति में सुधार करता है। इंडेक्स का उपयोग डेटाबेस तालिका में प्रत्येक पंक्ति को खोजे बिना हर बार डेटाबेस तालिका तक पहुँचने के लिए डेटा को जल्दी से खोजने के लिए किया जाता है।डेटाबेस टेबल के एक या अधिक स्तम्भ का उपयोग करके इंडेक्स बनाए जा सकते हैं, जो तेजी से रैंडम [[ऊपर देखो]] और आदेशित रिकॉर्ड की कुशल पहुंच दोनों के लिए आधार प्रदान करता है।
डेटाबेस इंडेक्स [[डेटा संरचना]] है जो इंडेक्स डेटा संरचना को बनाए रखने के लिए अतिरिक्त राइट्स और स्टोरेज स्पेस की मूल्य पर [[तालिका (डेटाबेस)]] पर डेटा पुनर्प्राप्ति संचालन की गति में सुधार करता है। इंडेक्स का उपयोग डेटाबेस तालिका में प्रत्येक पंक्ति को खोजे बिना हर बार डेटाबेस तालिका तक पहुँचने के लिए डेटा को जल्दी से खोजने के लिए किया जाता है।डेटाबेस टेबल के एक या अधिक स्तम्भ का उपयोग करके इंडेक्स बनाए जा सकते हैं, जो तेजी से रैंडम [[ऊपर देखो]] और आदेशित रिकॉर्ड की कुशल पहुंच दोनों के लिए आधार प्रदान करता है।


अनुक्रमणिका तालिका से डेटा के चयनित स्तंभों की प्रति है, जिसे बहुत ही कुशल खोज को सक्षम करने के लिए डिज़ाइन किया गया है। इंडेक्स में आम तौर पर डेटा की मूल पंक्ति के लिए कुंजी या सीधा लिंक शामिल होता है जिससे इसे कॉपी किया गया था, ताकि पूरी पंक्ति को कुशलतापूर्वक पुनर्प्राप्त किया जा सके। कुछ डेटाबेस डेवलपर्स को स्तंभ मानों पर इंडेक्स बनाने की अनुमति देकर इंडेक्सिंग की शक्ति का विस्तार करते हैं जिन्हें फ़ंक्शंस या [[अभिव्यक्ति (प्रोग्रामिंग)]] द्वारा रूपांतरित किया गया है। उदाहरण के लिए, <code>upper(last_name)</code> इंडेक्स बनाया जा सकता है, जो इंडेक्स में केवल <code>last_name</code> फ़ील्ड के अपर-केस संस्करणों को संग्रहीत करेगा। कभी-कभी समर्थित अन्य विकल्प आंशिक अनुक्रमणिका का उपयोग होता है, जहाँ अनुक्रमणिका प्रविष्टियाँ केवल उन्हीं अभिलेखों के लिए बनाई जाती हैं जो कुछ सशर्त अभिव्यक्ति को संतुष्ट करते हैं। लचीलेपन का और पहलू उपयोगकर्ता-परिभाषित कार्यों पर अनुक्रमण की अनुमति देना है, साथ ही साथ अंतर्निहित कार्यों के वर्गीकरण से बने भाव भी हैं।
अनुक्रमणिका तालिका से डेटा के चयनित स्तंभों की प्रति है, जिसे बहुत ही कुशल खोज को सक्षम करने के लिए डिज़ाइन किया गया है। इंडेक्स में सामान्यतः डेटा की मूल पंक्ति के लिए कुंजी या सीधा लिंक सम्मिलित होता है जिससे इसे कॉपी किया गया था, जिससे पूरी पंक्ति को कुशलतापूर्वक पुनर्प्राप्त किया जा सके। कुछ डेटाबेस डेवलपर्स को स्तंभ मानों पर इंडेक्स बनाने की अनुमति देकर इंडेक्सिंग की शक्ति का विस्तार करते हैं जिन्हें फ़ंक्शंस या [[अभिव्यक्ति (प्रोग्रामिंग)]] द्वारा रूपांतरित किया गया है। उदाहरण के लिए, <code>upper(last_name)</code> इंडेक्स बनाया जा सकता है, जो इंडेक्स में केवल <code>last_name</code> फ़ील्ड के अपर-केस संस्करणों को संग्रहीत करेगा। कभी-कभी समर्थित अन्य विकल्प आंशिक अनुक्रमणिका का उपयोग होता है, जहाँ अनुक्रमणिका प्रविष्टियाँ केवल उन्हीं अभिलेखों के लिए बनाई जाती हैं जो कुछ सशर्त अभिव्यक्ति को संतुष्ट करते हैं। लचीलेपन का और पहलू उपयोगकर्ता-परिभाषित कार्यों पर अनुक्रमण की अनुमति देना है, साथ ही साथ अंतर्निहित कार्यों के वर्गीकरण से बने भाव भी हैं।


== उपयोग ==
== उपयोग ==


=== तेजी से देखने के लिए समर्थन ===
=== तेजी से देखने के लिए समर्थन ===
अधिकांश [[डेटाबेस]] सॉफ़्टवेयर में इंडेक्सिंग तकनीक शामिल होती है जो प्रदर्शन को बेहतर बनाने के लिए उप-[[रैखिक समय]] लुकअप को सक्षम करती है, क्योंकि बड़े डेटाबेस के लिए [[रैखिक खोज]] अक्षम होती है।
अधिकांश [[डेटाबेस]] सॉफ़्टवेयर में इंडेक्सिंग विधि सम्मिलित होती है जो प्रदर्शन को उत्तम बनाने के लिए उप-[[रैखिक समय]] लुकअप को सक्षम करती है, क्योंकि बड़े डेटाबेस के लिए [[रैखिक खोज]] अक्षम होती है।


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


इंडेक्स कोई भी डेटा संरचना है जो लुकअप के प्रदर्शन को बेहतर बनाता है। इस उद्देश्य के लिए उपयोग की जाने वाली कई अलग-अलग :श्रेणी:डेटा संरचनाएं हैं। लुकअप प्रदर्शन, इंडेक्स आकार और इंडेक्स-अपडेट प्रदर्शन से जुड़े जटिल डिज़ाइन ट्रेड-ऑफ़ हैं। कई इंडेक्स डिज़ाइन लॉगरिदमिक (बिग ओ नोटेशन (लॉग (एन))) लुकअप प्रदर्शन प्रदर्शित करते हैं और कुछ अनुप्रयोगों में फ्लैट (बिग ओ नोटेशन (1)) प्रदर्शन प्राप्त करना संभव है।
इंडेक्स कोई भी डेटा संरचना है जो लुकअप के प्रदर्शन को उत्तम बनाता है। इस उद्देश्य के लिए उपयोग की जाने वाली कई अलग-अलग :श्रेणी:डेटा संरचनाएं हैं। लुकअप प्रदर्शन, इंडेक्स आकार और इंडेक्स-अपडेट प्रदर्शन से जुड़े जटिल डिज़ाइन ट्रेड-ऑफ़ हैं। कई इंडेक्स डिज़ाइन लॉगरिदमिक (बिग ओ नोटेशन (लॉग (एन))) लुकअप प्रदर्शन प्रदर्शित करते हैं और कुछ अनुप्रयोगों में फ्लैट (बिग ओ नोटेशन (1)) प्रदर्शन प्राप्त करना संभव है।


=== डेटाबेस बाधाओं को नियंत्रित करना ===
=== डेटाबेस बाधाओं को नियंत्रित करना ===
इंडेक्स का उपयोग पुलिस डेटाबेस बाधाओं, जैसे अद्वितीय, बहिष्करण, अद्वितीय कुंजी और [[विदेशी कुंजी]] के लिए किया जाता है। इंडेक्स को अद्वितीय के रूप में घोषित किया जा सकता है, जो अंतर्निहित तालिका पर अंतर्निहित बाधा उत्पन्न करता है। डाटाबेस सिस्टम आमतौर पर प्राथमिक कुंजी घोषित स्तम्भ के सेट पर इंडेक्स बनाते हैं, और कुछ इस बाधा को पुलिस के लिए पहले से मौजूद इंडेक्स का उपयोग करने में सक्षम हैं। कई डेटाबेस सिस्टमों की आवश्यकता होती है कि विदेशी कुंजी बाधा में स्तम्भ के संदर्भ और संदर्भित दोनों सेट अनुक्रमित होते हैं, इस प्रकार बाधा में भाग लेने वाली तालिकाओं में आवेषण, अद्यतन और हटाए जाने के प्रदर्शन में सुधार होता है।
इंडेक्स का उपयोग पुलिस डेटाबेस बाधाओं, जैसे अद्वितीय, बहिष्करण, अद्वितीय कुंजी और [[विदेशी कुंजी]] के लिए किया जाता है। इंडेक्स को अद्वितीय के रूप में घोषित किया जा सकता है, जो अंतर्निहित तालिका पर अंतर्निहित बाधा उत्पन्न करता है। डाटाबेस प्रणाली सामान्यतः प्राथमिक कुंजी घोषित स्तम्भ के समूह पर इंडेक्स बनाते हैं, और कुछ इस बाधा को पुलिस के लिए पहले से उपस्थित इंडेक्स का उपयोग करने में सक्षम हैं। कई डेटाबेस प्रणालियों की आवश्यकता होती है कि विदेशी कुंजी बाधा में स्तम्भ के संदर्भ और संदर्भित दोनों समूह अनुक्रमित होते हैं, इस प्रकार बाधा में भाग लेने वाली तालिकाओं में आवेषण, अद्यतन और हटाए जाने के प्रदर्शन में सुधार होता है।


कुछ डेटाबेस सिस्टम बहिष्करण बाधा का समर्थन करते हैं जो यह सुनिश्चित करता है कि, नए सम्मिलित या अपडेट किए गए रिकॉर्ड के लिए, निश्चित विधेय किसी अन्य रिकॉर्ड के लिए नहीं है। इसका उपयोग अद्वितीय बाधा (समानता विधेय के साथ) या अधिक जटिल बाधाओं को लागू करने के लिए किया जा सकता है, जैसे यह सुनिश्चित करना कि कोई अतिव्यापी समय सीमा या कोई प्रतिच्छेदन ज्यामिति वस्तु तालिका में संग्रहीत नहीं की जाएगी। इस तरह की बाधा को नियंत्रित करने के लिए विधेय को संतुष्ट करने वाले अभिलेखों की तेजी से खोज का समर्थन करने वाला इंडेक्स आवश्यक है।<ref name="9-1-create-table">[http://www.postgresql.org/docs/9.1/static/sql-createtable.html PostgreSQL 9.1.2 Documentation: CREATE TABLE]</ref>
कुछ डेटाबेस प्रणाली बहिष्करण बाधा का समर्थन करते हैं जो यह सुनिश्चित करता है कि, नए सम्मिलित या अपडेट किए गए रिकॉर्ड के लिए, निश्चित विधेय किसी अन्य रिकॉर्ड के लिए नहीं है। इसका उपयोग अद्वितीय बाधा (समानता विधेय के साथ) या अधिक जटिल बाधाओं को प्रायुक्त करने के लिए किया जा सकता है, जैसे यह सुनिश्चित करना कि कोई अतिव्यापी समय सीमा या कोई प्रतिच्छेदन ज्यामिति वस्तु तालिका में संग्रहीत नहीं की जाएगी। इस प्रकार की बाधा को नियंत्रित करने के लिए विधेय को संतुष्ट करने वाले अभिलेखों की तेजी से खोज का समर्थन करने वाला इंडेक्स आवश्यक है।<ref name="9-1-create-table">[http://www.postgresql.org/docs/9.1/static/sql-createtable.html PostgreSQL 9.1.2 Documentation: CREATE TABLE]</ref>




== इंडेक्स आर्किटेक्चर और इंडेक्सिंग तरीके ==
== इंडेक्स आर्किटेक्चर और इंडेक्सिंग विधियां ==


=== गैर-गुच्छित ===
=== गैर-गुच्छित ===
डेटा मनमाना क्रम में मौजूद है, लेकिन तार्किक क्रम इंडेक्स द्वारा निर्दिष्ट किया गया है। अनुक्रमित स्तंभ या अभिव्यक्ति के मान की परवाह किए बिना डेटा पंक्तियाँ पूरे तालिका में फैली हो सकती हैं। गैर-गुच्छित इंडेक्स ट्री में अनुक्रमित क्रम में इंडेक्स कुंजियाँ होती हैं, जिसमें इंडेक्स के लीफ लेवल में रिकॉर्ड के लिए पॉइंटर होता है (पृष्ठ-संगठित इंजनों में डेटा पेज में पेज और पंक्ति संख्या; फ़ाइल-संगठित इंजनों में पंक्ति ऑफ़सेट) ).
डेटा स्वैच्छिक क्रम में उपस्थित है, किन्तु तार्किक क्रम इंडेक्स द्वारा निर्दिष्ट किया गया है। अनुक्रमित स्तंभ या अभिव्यक्ति के मान की परवाह किए बिना डेटा पंक्तियाँ पूरे तालिका में फैली हो सकती हैं। गैर-गुच्छित इंडेक्स ट्री में अनुक्रमित क्रम में इंडेक्स कुंजियाँ होती हैं, जिसमें इंडेक्स के लीफ लेवल में रिकॉर्ड के लिए पॉइंटर होता है (पृष्ठ-संगठित इंजनों में डेटा पेज में पेज और पंक्ति संख्या; फ़ाइल-संगठित इंजनों में पंक्ति ऑफ़समूह) ).


गैर-संकुलित इंडेक्स में,
गैर-संकुलित इंडेक्स में,


* पंक्तियों का भौतिक क्रम अनुक्रमणिका क्रम के समान नहीं है।
* पंक्तियों का भौतिक क्रम अनुक्रमणिका क्रम के समान नहीं है।
* अनुक्रमित स्तम्भ आमतौर पर गैर-प्राथमिक कुंजी स्तम्भ होते हैं जिनका उपयोग जॉइन, व्हेयर और आदेश बाय क्लॉज में किया जाता है।
* अनुक्रमित स्तम्भ सामान्यतः गैर-प्राथमिक कुंजी स्तम्भ होते हैं जिनका उपयोग जॉइन, व्हेयर और आदेश बाय क्लॉज में किया जाता है।


डेटाबेस टेबल पर से अधिक गैर-गुच्छित इंडेक्स हो सकते हैं।
डेटाबेस टेबल पर से अधिक गैर-गुच्छित इंडेक्स हो सकते हैं।


=== गुच्छित ===
=== गुच्छित ===
गुच्छितिंग इंडेक्स से मिलान करने के लिए डेटा ब्लॉक को निश्चित विशिष्ट क्रम में बदल देता है, जिसके परिणामस्वरूप पंक्ति डेटा को क्रम में संग्रहीत किया जाता है। इसलिए, किसी दिए गए डेटाबेस टेबल पर केवल गुच्छित इंडेक्स बनाया जा सकता है। गुच्छित किए गए इंडेक्स पुनर्प्राप्ति की समग्र गति को बहुत बढ़ा सकते हैं, लेकिन आमतौर पर केवल वहीं जहां डेटा को अनुक्रमिक रूप से गुच्छित किए गए इंडेक्स के समान या रिवर्स आदेश में एक्सेस किया जाता है, या जब आइटम की श्रेणी का चयन किया जाता है।
गुच्छितिंग इंडेक्स से मिलान करने के लिए डेटा ब्लॉक को निश्चित विशिष्ट क्रम में बदल देता है, जिसके परिणामस्वरूप पंक्ति डेटा को क्रम में संग्रहीत किया जाता है। इसलिए, किसी दिए गए डेटाबेस टेबल पर केवल गुच्छित इंडेक्स बनाया जा सकता है। गुच्छित किए गए इंडेक्स पुनर्प्राप्ति की समग्र गति को बहुत बढ़ा सकते हैं, किन्तु सामान्यतः केवल वहीं जहां डेटा को अनुक्रमिक रूप से गुच्छित किए गए इंडेक्स के समान या रिवर्स आदेश में एक्सेस किया जाता है, या जब आइटम की श्रेणी का चयन किया जाता है।


चूंकि भौतिक रिकॉर्ड डिस्क पर इस तरह के क्रम में हैं, अनुक्रम में अगली पंक्ति आइटम पिछले के ठीक पहले या बाद में है, और इसलिए कम डेटा ब्लॉक रीड की आवश्यकता होती है। गुच्छित इंडेक्स की प्राथमिक विशेषता इसलिए इंडेक्स ब्लॉक के अनुसार भौतिक डेटा पंक्तियों का क्रम है जो उन्हें इंगित करता है। कुछ डेटाबेस डेटा और इंडेक्स ब्लॉक को अलग-अलग फाइलों में अलग करते हैं, अन्य दो पूरी तरह से अलग डेटा ब्लॉक को ही भौतिक फ़ाइल में डालते हैं।
चूंकि भौतिक रिकॉर्ड डिस्क पर इस प्रकार के क्रम में हैं, अनुक्रम में अगली पंक्ति आइटम पिछले के ठीक पहले या बाद में है, और इसलिए कम डेटा ब्लॉक रीड की आवश्यकता होती है। गुच्छित इंडेक्स की प्राथमिक विशेषता इसलिए इंडेक्स ब्लॉक के अनुसार भौतिक डेटा पंक्तियों का क्रम है जो उन्हें निरुपित करता है। कुछ डेटाबेस डेटा और इंडेक्स ब्लॉक को अलग-अलग फाइलों में अलग करते हैं, अन्य दो पूरी तरह से अलग डेटा ब्लॉक को ही भौतिक फ़ाइल में डालते हैं।


=== गुच्छित ===
=== गुच्छित ===
Line 41: Line 41:


== स्तम्भ आदेश ==
== स्तम्भ आदेश ==
वह क्रम जिसमें अनुक्रमणिका परिभाषा स्तंभों को परिभाषित करती है, महत्वपूर्ण है। केवल पहले अनुक्रमित स्तम्भ का उपयोग करके पंक्ति पहचानकर्ताओं का सेट पुनर्प्राप्त करना संभव है। हालांकि, केवल दूसरे या अधिक अनुक्रमित स्तम्भ का उपयोग करके पंक्ति पहचानकर्ताओं के सेट को पुनर्प्राप्त करना संभव या कुशल (अधिकांश डेटाबेस पर) नहीं है।
वह क्रम जिसमें अनुक्रमणिका परिभाषा स्तंभों को परिभाषित करती है, महत्वपूर्ण है। केवल पहले अनुक्रमित स्तम्भ का उपयोग करके पंक्ति पहचानकर्ताओं का समूह पुनर्प्राप्त करना संभव है। चूंकि, केवल दूसरे या अधिक अनुक्रमित स्तम्भ का उपयोग करके पंक्ति पहचानकर्ताओं के समूह को पुनर्प्राप्त करना संभव या कुशल (अधिकांश डेटाबेस पर) नहीं है।


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


कॉलम (<code>city, last_name, first_name</code>) पर बनाए गए समग्र सूचकांक के साथ फोन बुक उदाहरण में, यदि हम तीनों क्षेत्रों के लिए सटीक मान देकर खोज करते हैं, तो खोज का समय न्यूनतम है - लेकिन अगर हम केवल <code>city</code> और  <code>first_name</code> के लिए मान प्रदान करते हैं , खोज सभी मिलान किए गए रिकॉर्ड को पुनर्प्राप्त करने के लिए केवल <code>city</code> फ़ील्ड का उपयोग करती है। फिर एक अनुक्रमिक लुकअप <code>first_name</code> के साथ मिलान की जाँच करता है। इसलिए, प्रदर्शन को बेहतर बनाने के लिए, यह सुनिश्चित करना चाहिए कि खोज कॉलम के क्रम में इंडेक्स बनाया गया है।
कॉलम (<code>city, last_name, first_name</code>) पर बनाए गए समग्र सूचकांक के साथ फोन बुक उदाहरण में, यदि हम तीनों क्षेत्रों के लिए त्रुटिहीन मान देकर खोज करते हैं, तो खोज का समय न्यूनतम है - किन्तु यदि हम केवल <code>city</code> और  <code>first_name</code> के लिए मान प्रदान करते हैं , खोज सभी मिलान किए गए रिकॉर्ड को पुनर्प्राप्त करने के लिए केवल <code>city</code> फ़ील्ड का उपयोग करती है। फिर एक अनुक्रमिक लुकअप <code>first_name</code> के साथ मिलान की जाँच करता है। इसलिए, प्रदर्शन को उत्तम बनाने के लिए, यह सुनिश्चित करना चाहिए कि खोज कॉलम के क्रम में इंडेक्स बनाया गया है।


== अनुप्रयोग और सीमाएं ==
== अनुप्रयोग और सीमाएं ==
इंडेक्स कई अनुप्रयोगों के लिए उपयोगी होते हैं लेकिन कुछ सीमाओं के साथ आते हैं। निम्नलिखित [[SQL]] कथन पर विचार करें: {{code|SELECT first_name FROM people WHERE last_name {{=}} 'Smith';|sql}}. इस कथन को अनुक्रमणिका के बिना संसाधित करने के लिए डेटाबेस सॉफ़्टवेयर को तालिका में प्रत्येक पंक्ति पर last_name स्तम्भ देखना चाहिए (इसे [[पूर्ण तालिका स्कैन]] के रूप में जाना जाता है)। इंडेक्स के साथ डेटाबेस केवल इंडेक्स डेटा संरचना (आमतौर पर [[बी-वृक्ष]]) का अनुसरण करता है जब तक कि स्मिथ प्रविष्टि नहीं मिल जाती; यह कम्प्यूटेशनल रूप से पूर्ण टेबल स्कैन की तुलना में बहुत कम महंगा है।
इंडेक्स कई अनुप्रयोगों के लिए उपयोगी होते हैं किन्तु कुछ सीमाओं के साथ आते हैं। निम्नलिखित [[SQL]] कथन पर विचार करें: {{code|SELECT first_name FROM people WHERE last_name {{=}} 'Smith';|sql}}. इस कथन को अनुक्रमणिका के बिना संसाधित करने के लिए डेटाबेस सॉफ़्टवेयर को तालिका में प्रत्येक पंक्ति पर last_name स्तम्भ देखना चाहिए (इसे [[पूर्ण तालिका स्कैन]] के रूप में जाना जाता है)। इंडेक्स के साथ डेटाबेस केवल इंडेक्स डेटा संरचना (सामान्यतः [[बी-वृक्ष]]) का अनुसरण करता है जब तक कि स्मिथ प्रविष्टि नहीं मिल जाती; यह कम्प्यूटेशनल रूप से पूर्ण टेबल स्कैन की तुलना में बहुत कम महंगा है।


इस SQL ​​कथन पर विचार करें: {{code|SELECT email_address FROM customers WHERE email_address LIKE '%@wikipedia.org';|sql}}. यह क्वेरी प्रत्येक ग्राहक के लिए ईमेल पता देगी जिसका ईमेल पता @wikipedia.org के साथ समाप्त होता है, लेकिन भले ही ईमेल_एड्रेस स्तम्भ को अनुक्रमित किया गया हो, डेटाबेस को पूर्ण इंडेक्स स्कैन करना होगा। ऐसा इसलिए है क्योंकि इंडेक्स इस धारणा के साथ बनाया गया है कि शब्द बाएं से दाएं जाते हैं। खोज-शब्द की शुरुआत में [[वाइल्डकार्ड चरित्र]] के साथ, डेटाबेस सॉफ़्टवेयर अंतर्निहित अनुक्रमणिका डेटा संरचना का उपयोग करने में असमर्थ है (दूसरे शब्दों में, जहां-क्लॉज [[sargable]] नहीं है)। इस समस्या को किसी अन्य इंडेक्स को जोड़कर हल किया जा सकता है {{code|reverse(email_address)}} और इस तरह SQL क्वेरी: {{code|SELECT email_address FROM customers WHERE reverse(email_address) LIKE reverse('%@wikipedia.org');|sql}}. यह वाइल्ड-कार्ड को क्वेरी के सबसे दाहिने हिस्से में रखता है (अब {{samp|gro.aidepikiw@%}}), जिसे इंडेक्स रिवर्स (ईमेल_एड्रेस) पर संतुष्ट कर सकता है।
इस SQL ​​कथन पर विचार करें: {{code|SELECT email_address FROM customers WHERE email_address LIKE '%@wikipedia.org';|sql}}. यह क्वेरी प्रत्येक ग्राहक के लिए ईमेल पता देगी जिसका ईमेल पता @wikipedia.org के साथ समाप्त होता है, किन्तु चाहे ईमेल_एड्रेस स्तम्भ को अनुक्रमित किया गया हो, डेटाबेस को पूर्ण इंडेक्स स्कैन करना होगा। ऐसा इसलिए है क्योंकि इंडेक्स इस धारणा के साथ बनाया गया है कि शब्द बाएं से दाएं जाते हैं। खोज-शब्द की प्रारंभ में [[वाइल्डकार्ड चरित्र]] के साथ, डेटाबेस सॉफ़्टवेयर अंतर्निहित अनुक्रमणिका डेटा संरचना का उपयोग करने में असमर्थ है (दूसरे शब्दों में, जहां-क्लॉज [[sargable]] नहीं है)। इस समस्या को किसी अन्य इंडेक्स को जोड़कर हल किया जा सकता है {{code|reverse(email_address)}} और इस प्रकार SQL क्वेरी: {{code|SELECT email_address FROM customers WHERE reverse(email_address) LIKE reverse('%@wikipedia.org');|sql}}. यह वाइल्ड-कार्ड को क्वेरी के सबसे दाहिने हिस्से में रखता है (अब {{samp|gro.aidepikiw@%}}), जिसे इंडेक्स रिवर्स (ईमेल_एड्रेस) पर संतुष्ट कर सकता है।


जब वाइल्डकार्ड वर्णों को खोज शब्द के दोनों ओर %wikipedia.org% के रूप में उपयोग किया जाता है, तो इस फ़ील्ड पर उपलब्ध अनुक्रमणिका का उपयोग नहीं किया जाता है। बल्कि केवल क्रमिक खोज की जाती है, जो {{tmath|O(N)}} समय लेती है।
जब वाइल्डकार्ड वर्णों को खोज शब्द के दोनों ओर %wikipedia.org% के रूप में उपयोग किया जाता है, तो इस फ़ील्ड पर उपलब्ध अनुक्रमणिका का उपयोग नहीं किया जाता है। किन्तु केवल क्रमिक खोज की जाती है, जो {{tmath|O(N)}} समय लेती है।


== इंडेक्स के प्रकार ==
== इंडेक्स के प्रकार ==
Line 58: Line 58:
=== बिटमैप इंडेक्स ===
=== बिटमैप इंडेक्स ===
{{Main|बिटमैप इंडेक्स}}
{{Main|बिटमैप इंडेक्स}}
बिटमैप इंडेक्स विशेष प्रकार का इंडेक्सिंग है जो अपने डेटा के थोक को बिट एरेज़ (बिटमैप्स) के रूप में संग्रहीत करता है और इन बिटमैप्स पर [[बिटवाइज़ ऑपरेशन]] करके अधिकांश प्रश्नों का उत्तर देता है। सबसे अधिक उपयोग किए जाने वाले इंडेक्स, जैसे कि [[बी + पेड़]], सबसे अधिक कुशल होते हैं यदि उनके द्वारा इंडेक्स किए जाने वाले मान कम संख्या में दोहराए या दोहराए नहीं जाते हैं। इसके विपरीत, बिटमैप इंडेक्स उन मामलों के लिए डिज़ाइन किया गया है जहां चर के मान बहुत बार दोहराए जाते हैं। उदाहरण के लिए, ग्राहक डेटाबेस में सेक्स फ़ील्ड में आमतौर पर अधिकतम तीन अलग-अलग मान होते हैं: पुरुष, महिला या अज्ञात (रिकॉर्ड नहीं किया गया)। ऐसे चरों के लिए, बिटमैप इंडेक्स का आमतौर पर उपयोग किए जाने वाले पेड़ों पर महत्वपूर्ण प्रदर्शन लाभ हो सकता है।
बिटमैप इंडेक्स विशेष प्रकार का इंडेक्सिंग है जो अपने डेटा के थोक को बिट एरेज़ (बिटमैप्स) के रूप में संग्रहीत करता है और इन बिटमैप्स पर [[बिटवाइज़ ऑपरेशन]] करके अधिकांश प्रश्नों का उत्तर देता है। सबसे अधिक उपयोग किए जाने वाले इंडेक्स, जैसे कि [[बी + पेड़]], सबसे अधिक कुशल होते हैं यदि उनके द्वारा इंडेक्स किए जाने वाले मान कम संख्या में दोहराए या दोहराए नहीं जाते हैं। इसके विपरीत, बिटमैप इंडेक्स उन स्थितियों के लिए डिज़ाइन किया गया है जहां चर के मान बहुत बार दोहराए जाते हैं। उदाहरण के लिए, ग्राहक डेटाबेस में सेक्स फ़ील्ड में सामान्यतः अधिकतम तीन अलग-अलग मान होते हैं: पुरुष, महिला या अज्ञात (रिकॉर्ड नहीं किया गया)। ऐसे चरों के लिए, बिटमैप इंडेक्स का सामान्यतः उपयोग किए जाने वाले पेड़ों पर महत्वपूर्ण प्रदर्शन लाभ हो सकता है।


=== सघन इंडेक्स ===
=== सघन इंडेक्स ===
Line 81: Line 81:


== इंडेक्स कार्यान्वयन ==
== इंडेक्स कार्यान्वयन ==
विभिन्न प्रकार की डेटा संरचनाओं का उपयोग करके इंडेक्सों को लागू किया जा सकता है। लोकप्रिय इंडेक्सों में संतुलित पेड़, बी+ पेड़ और हैश टेबल शामिल हैं।<ref>{{Cite book|url=http://searchsecurity.techtarget.com/generic/0,295582,sid87_gci1184450,00.html|work=Beginning Database Design |isbn=978-0-7645-7490-0|author=Gavin Powell|title=Chapter 8: Building Fast-Performing Database Models|publisher=[[Wrox Press|Wrox Publishing]]|year=2006}}</ref>
विभिन्न प्रकार की डेटा संरचनाओं का उपयोग करके इंडेक्सों को प्रायुक्त किया जा सकता है। लोकप्रिय इंडेक्सों में संतुलित पेड़, बी+ पेड़ और हैश टेबल सम्मिलित हैं।<ref>{{Cite book|url=http://searchsecurity.techtarget.com/generic/0,295582,sid87_gci1184450,00.html|work=Beginning Database Design |isbn=978-0-7645-7490-0|author=Gavin Powell|title=Chapter 8: Building Fast-Performing Database Models|publisher=[[Wrox Press|Wrox Publishing]]|year=2006}}</ref>


माइक्रोसॉफ्ट एसक्यूएल सर्वर में, गुच्छित इंडेक्स का [[लसीका नोड]] वास्तविक डेटा से मेल खाता है, न कि केवल डेटा के लिए पॉइंटर जो कहीं और रहता है, जैसा कि गैर-गुच्छित इंडेक्स के मामले में होता है।<ref>{{cite web|url=http://msdn2.microsoft.com/en-us/library/ms177443.aspx|work=SQL Server 2005 Books Online (September 2007)|title=Clustered Index Structures}}</ref> प्रत्येक संबंध में गुच्छित इंडेक्स और कई अनगुच्छित इंडेक्स हो सकते हैं।<ref>{{cite web|url=http://www.microsoft.com/mspress/books/9364.aspx|work=SQL Server 2005 Implementation and Management|author1=Daren Bieniek |author2=Randy Dess |author3=Mike Hotek |author4=Javier Loria |author5=Adam Machanic |author6=Antonio Soto |author7=Adolfo Wiernik |title=Chapter 4: Creating Indices|publisher=Microsoft Press|date=January 2006}}</ref>
माइक्रोसॉफ्ट एसक्यूएल सर्वर में, गुच्छित इंडेक्स का [[लसीका नोड]] वास्तविक डेटा से मेल खाता है, न कि केवल डेटा के लिए पॉइंटर जो कहीं और रहता है, जैसा कि गैर-गुच्छित इंडेक्स के स्थितियों में होता है।<ref>{{cite web|url=http://msdn2.microsoft.com/en-us/library/ms177443.aspx|work=SQL Server 2005 Books Online (September 2007)|title=Clustered Index Structures}}</ref> प्रत्येक संबंध में गुच्छित इंडेक्स और कई अनगुच्छित इंडेक्स हो सकते हैं।<ref>{{cite web|url=http://www.microsoft.com/mspress/books/9364.aspx|work=SQL Server 2005 Implementation and Management|author1=Daren Bieniek |author2=Randy Dess |author3=Mike Hotek |author4=Javier Loria |author5=Adam Machanic |author6=Antonio Soto |author7=Adolfo Wiernik |title=Chapter 4: Creating Indices|publisher=Microsoft Press|date=January 2006}}</ref>




Line 89: Line 89:
=== इंडेक्स समवर्ती नियंत्रण ===
=== इंडेक्स समवर्ती नियंत्रण ===
{{Main|इंडेक्स लॉकिंग}}
{{Main|इंडेक्स लॉकिंग}}
इंडेक्स को आम तौर पर कई लेनदेन और प्रक्रियाओं द्वारा समवर्ती रूप से एक्सेस किया जा रहा है, और इस प्रकार समवर्ती नियंत्रण की आवश्यकता होती है। जबकि सिद्धांत रूप में इंडेक्स सामान्य डेटाबेस समवर्ती नियंत्रण विधियों का उपयोग कर सकते हैं, इंडेक्स के लिए विशेष समवर्ती नियंत्रण विधियां मौजूद हैं, जो पर्याप्त प्रदर्शन लाभ के लिए सामान्य तरीकों के संयोजन के साथ लागू होती हैं।
इंडेक्स को सामान्यतः कई लेनदेन और प्रक्रियाओं द्वारा समवर्ती रूप से एक्सेस किया जा रहा है, और इस प्रकार समवर्ती नियंत्रण की आवश्यकता होती है। चूंकि सिद्धांत रूप में इंडेक्स सामान्य डेटाबेस समवर्ती नियंत्रण विधियों का उपयोग कर सकते हैं, इंडेक्स के लिए विशेष समवर्ती नियंत्रण विधियां उपस्थित हैं, जो पर्याप्त प्रदर्शन लाभ के लिए सामान्य विधियों के संयोजन के साथ प्रायुक्त होती हैं।


== कवरिंग इंडेक्स ==
== कवरिंग इंडेक्स ==
ज्यादातर मामलों में, डेटा रिकॉर्ड्स को तुरंत ढूंढने के लिए इंडेक्स का उपयोग किया जाता है जिससे आवश्यक डेटा पढ़ा जाता है। दूसरे शब्दों में, इंडेक्स का उपयोग केवल तालिका में डेटा रिकॉर्ड का पता लगाने के लिए किया जाता है, न कि डेटा वापस करने के लिए किया जाता है।
अधिकांश स्थितियों में, डेटा रिकॉर्ड्स को तुरंत ढूंढने के लिए इंडेक्स का उपयोग किया जाता है जिससे आवश्यक डेटा पढ़ा जाता है। दूसरे शब्दों में, इंडेक्स का उपयोग केवल तालिका में डेटा रिकॉर्ड का पता लगाने के लिए किया जाता है, न कि डेटा वापस करने के लिए किया जाता है।


कवरिंग इंडेक्स विशेष मामला है जहां इंडेक्स में आवश्यक डेटा फ़ील्ड होते हैं और आवश्यक डेटा का उत्तर दे सकते हैं।
कवरिंग इंडेक्स विशेष स्थिति है जहां इंडेक्स में आवश्यक डेटा फ़ील्ड होते हैं और आवश्यक डेटा का उत्तर दे सकते हैं।


निम्न तालिका पर विचार करें (अन्य क्षेत्रों को छोड़ दिया गया):
निम्न तालिका पर विचार करें (अन्य क्षेत्रों को छोड़ दिया गया):
Line 116: Line 116:
| ...
| ...
|}
|}
आईडी 13 के लिए नाम खोजने के लिए, (आईडी) पर इंडेक्स उपयोगी है, लेकिन नाम प्राप्त करने के लिए रिकॉर्ड को अभी भी पढ़ा जाना चाहिए। हालाँकि, (आईडी, नाम) पर इंडेक्स में आवश्यक डेटा फ़ील्ड होता है और रिकॉर्ड देखने की आवश्यकता समाप्त हो जाती है।
आईडी 13 के लिए नाम खोजने के लिए, (आईडी) पर इंडेक्स उपयोगी है, किन्तु नाम प्राप्त करने के लिए रिकॉर्ड को अभी भी पढ़ा जाना चाहिए। चूँकि, (आईडी, नाम) पर इंडेक्स में आवश्यक डेटा फ़ील्ड होता है और रिकॉर्ड देखने की आवश्यकता समाप्त हो जाती है।


कवरिंग इंडेक्स प्रत्येक विशिष्ट तालिका के लिए होते हैं। कई तालिकाओं में शामिल होने/पहुंचने वाली क्वेरी संभावित रूप से इनमें से से अधिक तालिकाओं पर अनुक्रमणिका को कवर करने पर विचार कर सकती हैं।<ref name="covering_indexes_joined_queries">[http://literatejava.com/sql/covering-indexes-query-optimization/ कवरिंग इंडेक्स फॉर क्वेरी ऑप्टिमाइज़ेशन]</ref>
कवरिंग इंडेक्स प्रत्येक विशिष्ट तालिका के लिए होते हैं। कई तालिकाओं में सम्मिलित होने/पहुंचने वाली क्वेरी संभावित रूप से इनमें से से अधिक तालिकाओं पर अनुक्रमणिका को कवर करने पर विचार कर सकती हैं।<ref name="covering_indexes_joined_queries">[http://literatejava.com/sql/covering-indexes-query-optimization/ कवरिंग इंडेक्स फॉर क्वेरी ऑप्टिमाइज़ेशन]</ref>


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


== मानकीकरण ==
== मानकीकरण ==

Revision as of 10:57, 24 February 2023

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

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

उपयोग

तेजी से देखने के लिए समर्थन

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

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

इंडेक्स कोई भी डेटा संरचना है जो लुकअप के प्रदर्शन को उत्तम बनाता है। इस उद्देश्य के लिए उपयोग की जाने वाली कई अलग-अलग :श्रेणी:डेटा संरचनाएं हैं। लुकअप प्रदर्शन, इंडेक्स आकार और इंडेक्स-अपडेट प्रदर्शन से जुड़े जटिल डिज़ाइन ट्रेड-ऑफ़ हैं। कई इंडेक्स डिज़ाइन लॉगरिदमिक (बिग ओ नोटेशन (लॉग (एन))) लुकअप प्रदर्शन प्रदर्शित करते हैं और कुछ अनुप्रयोगों में फ्लैट (बिग ओ नोटेशन (1)) प्रदर्शन प्राप्त करना संभव है।

डेटाबेस बाधाओं को नियंत्रित करना

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

कुछ डेटाबेस प्रणाली बहिष्करण बाधा का समर्थन करते हैं जो यह सुनिश्चित करता है कि, नए सम्मिलित या अपडेट किए गए रिकॉर्ड के लिए, निश्चित विधेय किसी अन्य रिकॉर्ड के लिए नहीं है। इसका उपयोग अद्वितीय बाधा (समानता विधेय के साथ) या अधिक जटिल बाधाओं को प्रायुक्त करने के लिए किया जा सकता है, जैसे यह सुनिश्चित करना कि कोई अतिव्यापी समय सीमा या कोई प्रतिच्छेदन ज्यामिति वस्तु तालिका में संग्रहीत नहीं की जाएगी। इस प्रकार की बाधा को नियंत्रित करने के लिए विधेय को संतुष्ट करने वाले अभिलेखों की तेजी से खोज का समर्थन करने वाला इंडेक्स आवश्यक है।[1]


इंडेक्स आर्किटेक्चर और इंडेक्सिंग विधियां

गैर-गुच्छित

डेटा स्वैच्छिक क्रम में उपस्थित है, किन्तु तार्किक क्रम इंडेक्स द्वारा निर्दिष्ट किया गया है। अनुक्रमित स्तंभ या अभिव्यक्ति के मान की परवाह किए बिना डेटा पंक्तियाँ पूरे तालिका में फैली हो सकती हैं। गैर-गुच्छित इंडेक्स ट्री में अनुक्रमित क्रम में इंडेक्स कुंजियाँ होती हैं, जिसमें इंडेक्स के लीफ लेवल में रिकॉर्ड के लिए पॉइंटर होता है (पृष्ठ-संगठित इंजनों में डेटा पेज में पेज और पंक्ति संख्या; फ़ाइल-संगठित इंजनों में पंक्ति ऑफ़समूह) ).

गैर-संकुलित इंडेक्स में,

  • पंक्तियों का भौतिक क्रम अनुक्रमणिका क्रम के समान नहीं है।
  • अनुक्रमित स्तम्भ सामान्यतः गैर-प्राथमिक कुंजी स्तम्भ होते हैं जिनका उपयोग जॉइन, व्हेयर और आदेश बाय क्लॉज में किया जाता है।

डेटाबेस टेबल पर से अधिक गैर-गुच्छित इंडेक्स हो सकते हैं।

गुच्छित

गुच्छितिंग इंडेक्स से मिलान करने के लिए डेटा ब्लॉक को निश्चित विशिष्ट क्रम में बदल देता है, जिसके परिणामस्वरूप पंक्ति डेटा को क्रम में संग्रहीत किया जाता है। इसलिए, किसी दिए गए डेटाबेस टेबल पर केवल गुच्छित इंडेक्स बनाया जा सकता है। गुच्छित किए गए इंडेक्स पुनर्प्राप्ति की समग्र गति को बहुत बढ़ा सकते हैं, किन्तु सामान्यतः केवल वहीं जहां डेटा को अनुक्रमिक रूप से गुच्छित किए गए इंडेक्स के समान या रिवर्स आदेश में एक्सेस किया जाता है, या जब आइटम की श्रेणी का चयन किया जाता है।

चूंकि भौतिक रिकॉर्ड डिस्क पर इस प्रकार के क्रम में हैं, अनुक्रम में अगली पंक्ति आइटम पिछले के ठीक पहले या बाद में है, और इसलिए कम डेटा ब्लॉक रीड की आवश्यकता होती है। गुच्छित इंडेक्स की प्राथमिक विशेषता इसलिए इंडेक्स ब्लॉक के अनुसार भौतिक डेटा पंक्तियों का क्रम है जो उन्हें निरुपित करता है। कुछ डेटाबेस डेटा और इंडेक्स ब्लॉक को अलग-अलग फाइलों में अलग करते हैं, अन्य दो पूरी तरह से अलग डेटा ब्लॉक को ही भौतिक फ़ाइल में डालते हैं।

गुच्छित

जब कई डेटाबेस और कई टेबल जुड़ जाते हैं, तो इसे गुच्छित कहा जाता है (पहले वर्णित गुच्छित इंडेक्स के साथ भ्रमित नहीं होना चाहिए)। गुच्छित कुंजी के मान को साझा करने वाली तालिकाओं के रिकॉर्ड समान या आस-पास के डेटा ब्लॉक में साथ संग्रहीत किए जाएंगे। यह गुच्छित कुंजी पर इन तालिकाओं के जुड़ाव में सुधार कर सकता है, क्योंकि मिलान रिकॉर्ड साथ संग्रहीत किए जाते हैं और उन्हें खोजने के लिए कम I/O की आवश्यकता होती है।[2] गुच्छित कॉन्फ़िगरेशन परिभाषित करता है तालिका में डेटा लेआउट जो गुच्छित के हिस्से हैं। गुच्छित को बी-ट्री इंडेक्स या हैश तालिका के साथ जोड़ा जा सकता है। डेटा ब्लॉक जहां तालिका रिकॉर्ड संग्रहीत किया जाता है, गुच्छित कुंजी के मान द्वारा परिभाषित किया जाता है।

स्तम्भ आदेश

वह क्रम जिसमें अनुक्रमणिका परिभाषा स्तंभों को परिभाषित करती है, महत्वपूर्ण है। केवल पहले अनुक्रमित स्तम्भ का उपयोग करके पंक्ति पहचानकर्ताओं का समूह पुनर्प्राप्त करना संभव है। चूंकि, केवल दूसरे या अधिक अनुक्रमित स्तम्भ का उपयोग करके पंक्ति पहचानकर्ताओं के समूह को पुनर्प्राप्त करना संभव या कुशल (अधिकांश डेटाबेस पर) नहीं है।

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

कॉलम (city, last_name, first_name) पर बनाए गए समग्र सूचकांक के साथ फोन बुक उदाहरण में, यदि हम तीनों क्षेत्रों के लिए त्रुटिहीन मान देकर खोज करते हैं, तो खोज का समय न्यूनतम है - किन्तु यदि हम केवल city और first_name के लिए मान प्रदान करते हैं , खोज सभी मिलान किए गए रिकॉर्ड को पुनर्प्राप्त करने के लिए केवल city फ़ील्ड का उपयोग करती है। फिर एक अनुक्रमिक लुकअप first_name के साथ मिलान की जाँच करता है। इसलिए, प्रदर्शन को उत्तम बनाने के लिए, यह सुनिश्चित करना चाहिए कि खोज कॉलम के क्रम में इंडेक्स बनाया गया है।

अनुप्रयोग और सीमाएं

इंडेक्स कई अनुप्रयोगों के लिए उपयोगी होते हैं किन्तु कुछ सीमाओं के साथ आते हैं। निम्नलिखित SQL कथन पर विचार करें: SELECT first_name FROM people WHERE last_name = 'Smith';. इस कथन को अनुक्रमणिका के बिना संसाधित करने के लिए डेटाबेस सॉफ़्टवेयर को तालिका में प्रत्येक पंक्ति पर last_name स्तम्भ देखना चाहिए (इसे पूर्ण तालिका स्कैन के रूप में जाना जाता है)। इंडेक्स के साथ डेटाबेस केवल इंडेक्स डेटा संरचना (सामान्यतः बी-वृक्ष) का अनुसरण करता है जब तक कि स्मिथ प्रविष्टि नहीं मिल जाती; यह कम्प्यूटेशनल रूप से पूर्ण टेबल स्कैन की तुलना में बहुत कम महंगा है।

इस SQL ​​कथन पर विचार करें: SELECT email_address FROM customers WHERE email_address LIKE '%@wikipedia.org';. यह क्वेरी प्रत्येक ग्राहक के लिए ईमेल पता देगी जिसका ईमेल पता @wikipedia.org के साथ समाप्त होता है, किन्तु चाहे ईमेल_एड्रेस स्तम्भ को अनुक्रमित किया गया हो, डेटाबेस को पूर्ण इंडेक्स स्कैन करना होगा। ऐसा इसलिए है क्योंकि इंडेक्स इस धारणा के साथ बनाया गया है कि शब्द बाएं से दाएं जाते हैं। खोज-शब्द की प्रारंभ में वाइल्डकार्ड चरित्र के साथ, डेटाबेस सॉफ़्टवेयर अंतर्निहित अनुक्रमणिका डेटा संरचना का उपयोग करने में असमर्थ है (दूसरे शब्दों में, जहां-क्लॉज sargable नहीं है)। इस समस्या को किसी अन्य इंडेक्स को जोड़कर हल किया जा सकता है reverse(email_address) और इस प्रकार SQL क्वेरी: SELECT email_address FROM customers WHERE reverse(email_address) LIKE reverse('%@wikipedia.org');. यह वाइल्ड-कार्ड को क्वेरी के सबसे दाहिने हिस्से में रखता है (अब gro.aidepikiw@%), जिसे इंडेक्स रिवर्स (ईमेल_एड्रेस) पर संतुष्ट कर सकता है।

जब वाइल्डकार्ड वर्णों को खोज शब्द के दोनों ओर %wikipedia.org% के रूप में उपयोग किया जाता है, तो इस फ़ील्ड पर उपलब्ध अनुक्रमणिका का उपयोग नहीं किया जाता है। किन्तु केवल क्रमिक खोज की जाती है, जो समय लेती है।

इंडेक्स के प्रकार

बिटमैप इंडेक्स

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

सघन इंडेक्स

डेटाबेस में सघन अनुक्रमणिका कम्प्यूटर फाइल है जिसमें डेटा फ़ाइल में प्रत्येक रिकॉर्ड (कंप्यूटर विज्ञान) के लिए कुंजी और पॉइंटर (कंप्यूटर प्रोग्रामिंग) के जोड़े होते हैं। इस फ़ाइल की प्रत्येक कुंजी विशेष सूचक के साथ क्रमबद्ध डेटा फ़ाइल में रिकॉर्ड से जुड़ी है। डुप्लीकेट कुंजियों के साथ संकुलित इंडेक्सों में, सघन इंडेक्स उस कुंजी के साथ पहले रिकॉर्ड की ओर इशारा करता है।[3]


विरल इंडेक्स

डेटाबेस में स्पार्स इंडेक्स फ़ाइल है जिसमें डेटा फ़ाइल में प्रत्येक ब्लॉक (डेटा स्टोरेज) के लिए कुंजी और पॉइंटर्स के जोड़े होते हैं। इस फ़ाइल की प्रत्येक कुंजी सॉर्ट की गई डेटा फ़ाइल में ब्लॉक के लिए विशेष पॉइंटर से जुड़ी होती है। डुप्लीकेट कुंजियों वाले संकुल इंडेक्सों में, स्पार्स इंडेक्स प्रत्येक ब्लॉक में सबसे कम खोज कुंजी की ओर इशारा करता है।

रिवर्स इंडेक्स

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

प्राथमिक इंडेक्स

प्राथमिक अनुक्रमणिका में तालिका के प्रमुख फ़ील्ड और तालिका के गैर-कुंजी फ़ील्ड के लिए सूचक होते हैं। जब डेटाबेस में तालिका बनाई जाती है तो प्राथमिक अनुक्रमणिका स्वचालित रूप से बनाई जाती है।

माध्यमिक इंडेक्स

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

हैश इंडेक्स

इंडेक्स कार्यान्वयन

विभिन्न प्रकार की डेटा संरचनाओं का उपयोग करके इंडेक्सों को प्रायुक्त किया जा सकता है। लोकप्रिय इंडेक्सों में संतुलित पेड़, बी+ पेड़ और हैश टेबल सम्मिलित हैं।[4]

माइक्रोसॉफ्ट एसक्यूएल सर्वर में, गुच्छित इंडेक्स का लसीका नोड वास्तविक डेटा से मेल खाता है, न कि केवल डेटा के लिए पॉइंटर जो कहीं और रहता है, जैसा कि गैर-गुच्छित इंडेक्स के स्थितियों में होता है।[5] प्रत्येक संबंध में गुच्छित इंडेक्स और कई अनगुच्छित इंडेक्स हो सकते हैं।[6]


इंडेक्स समवर्ती नियंत्रण

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

कवरिंग इंडेक्स

अधिकांश स्थितियों में, डेटा रिकॉर्ड्स को तुरंत ढूंढने के लिए इंडेक्स का उपयोग किया जाता है जिससे आवश्यक डेटा पढ़ा जाता है। दूसरे शब्दों में, इंडेक्स का उपयोग केवल तालिका में डेटा रिकॉर्ड का पता लगाने के लिए किया जाता है, न कि डेटा वापस करने के लिए किया जाता है।

कवरिंग इंडेक्स विशेष स्थिति है जहां इंडेक्स में आवश्यक डेटा फ़ील्ड होते हैं और आवश्यक डेटा का उत्तर दे सकते हैं।

निम्न तालिका पर विचार करें (अन्य क्षेत्रों को छोड़ दिया गया):

आईडी नाम अन्य क्षेत्र
12 प्लग ...
13 लैंप ...
14 फ्यूज ...

आईडी 13 के लिए नाम खोजने के लिए, (आईडी) पर इंडेक्स उपयोगी है, किन्तु नाम प्राप्त करने के लिए रिकॉर्ड को अभी भी पढ़ा जाना चाहिए। चूँकि, (आईडी, नाम) पर इंडेक्स में आवश्यक डेटा फ़ील्ड होता है और रिकॉर्ड देखने की आवश्यकता समाप्त हो जाती है।

कवरिंग इंडेक्स प्रत्येक विशिष्ट तालिका के लिए होते हैं। कई तालिकाओं में सम्मिलित होने/पहुंचने वाली क्वेरी संभावित रूप से इनमें से से अधिक तालिकाओं पर अनुक्रमणिका को कवर करने पर विचार कर सकती हैं।[7]

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

मानकीकरण

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

यह भी देखें


संदर्भ

  1. PostgreSQL 9.1.2 Documentation: CREATE TABLE
  2. क्लस्टर का अवलोकन Oracle® डेटाबेस अवधारणा 10g रिलीज़ 1 (10.1)
  3. Database Systems: The Complete Book. Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer D. Widom
  4. Gavin Powell (2006). Chapter 8: Building Fast-Performing Database Models. ISBN 978-0-7645-7490-0. {{cite book}}: |work= ignored (help)
  5. "Clustered Index Structures". SQL Server 2005 Books Online (September 2007).
  6. Daren Bieniek; Randy Dess; Mike Hotek; Javier Loria; Adam Machanic; Antonio Soto; Adolfo Wiernik (January 2006). "Chapter 4: Creating Indices". SQL Server 2005 Implementation and Management. Microsoft Press.
  7. कवरिंग इंडेक्स फॉर क्वेरी ऑप्टिमाइज़ेशन