एमएस एसक्यूएल इंडेक्स। एसक्यूएल सर्वर - क्या माइक्रोसॉफ्ट एसक्यूएल में कवरिंग इंडेक्स बनाते समय ऑर्डर मायने रखता है? लगातार गणना किए गए कॉलम

- इंडेक्स डिस्क पर एक संरचना है जो किसी तालिका या दृश्य से जुड़ी होती है और तालिका या दृश्य से पंक्तियों की पुनर्प्राप्ति को गति देती है। एक इंडेक्स में किसी तालिका या दृश्य में एक या अधिक कॉलम से निर्मित कुंजियाँ होती हैं। इन कुंजियों को एक संतुलित वृक्ष संरचना में संग्रहीत किया जाता है जो SQL सर्वर में उनके कुंजी मानों द्वारा पंक्तियों की त्वरित खोज का समर्थन करता है।

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

--एक गैर-संकुल सूचकांक की संरचना बिल्कुल संकुल सूचकांक के समान होती है, लेकिन दो महत्वपूर्ण अंतरों के साथ:
--एक गैर-संकुल सूचकांक तालिका में पंक्तियों के भौतिक क्रम को नहीं बदलता है, और एक गैर-संकुल सूचकांक में पत्ती पृष्ठों में सूचकांक कुंजी और बुकमार्क शामिल होते हैं।

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

--किसी कारण से, एक क्लस्टर्ड इंडेक्स एक नॉनक्लस्टर्ड इंडेक्स की तुलना में तेजी से चलता है। जब सिस्टम क्लस्टर्ड इंडेक्स को स्कैन करता है, तो डेटा पेजों को स्कैन करने के लिए बी-ट्री संरचना को छोड़ने की कोई आवश्यकता नहीं होती है क्योंकि ऐसे पेज पहले से ही ट्री के लीफ स्तर पर मौजूद होते हैं।

--एक गैर-संकुल सूचकांक को संबंधित संकुल सूचकांक की तुलना में अधिक I/O संचालन की भी आवश्यकता होती है।

- गैर-संकुल सूचकांक को बी-ट्री को स्कैन करने के बाद डेटा पृष्ठों को पढ़ने की जरूरत है या, यदि तालिका के किसी अन्य कॉलम पर क्लस्टर सूचकांक है, तो गैर-संकुल सूचकांक को क्लस्टर सूचकांक की बी-ट्री संरचना को पढ़ने की जरूरत है .

-तो एक क्लस्टर्ड इंडेक्स टेबल स्कैन की तुलना में काफी तेज होगा, भले ही इसकी चयनात्मकता काफी खराब हो (क्वेरी बहुत सारी पंक्तियाँ लौटाती है)

तालिका tsql.dbo.NI बनाएँ
आईडी पूर्णतया शून्य नहीं है,
टी चार(8) शून्य
);

तालिका tsql.dbo.NCI बनाएँ
आईडी पूर्णतया शून्य नहीं है,
टी चार(8) शून्य
);

- एक क्लस्टर्ड इंडेक्स बनाएं

क्लस्टर्ड इंडेक्स IX_1 बनाएं
tsql.dbo.NCI(आईडी) पर;

- एक टेबल पर एक नॉनक्लस्टर्ड इंडेक्स बनाएं

गैर-संकुलित सूचकांक IX_2 बनाएं
tsql.dbo.NCI(T) पर;

--परीक्षण डेटा जोड़ें
घोषणा @i INT = 100000;
घोषित करें @t CHAR(1) = "T";

जबकि @i > 0
शुरू
tsql.dbo.NI मानों में डालें (@i, @t + CAST(@i AS char(6)));
tsql.dbo.NCI मानों में डालें (@i, @t + CAST(@i AS char(6)));
सेट @i -= 1;
अंत

-- अनुक्रमणिका वाली तालिका पर प्रश्न
tsql.dbo.NCI से आईडी, टी चुनें
आईडी द्वारा आदेश, टी

Tsql.dbo.NCI से आईडी, COUNT(*) AS C चुनें
आईडी द्वारा समूह, टी

tsql.dbo.NCI से आईडी, टी चुनें
जहां आईडी > 4000 और आईडी< 55000 AND T LIKE "T%"

--दोनों अनुक्रमणिका का उपयोग करके क्वेरी करें
टीएसक्यूएल का प्रयोग करें;
कास्ट चुनें(dbo.NCI.ID वर्चर के रूप में)
डीबीओ.एनसीआई से
dbo.NCI.ID द्वारा समूह
संघ सब
dbo.NCI.T चुनें
डीबीओ.एनसीआई से
dbo.NCI.T द्वारा समूह

--सूचकांक जानकारी
इंडेक्स_टाइप_डेस्क, इंडेक्स_डेप्थ, इंडेक्स_लेवल चुनें,
पेज_गिनती, रिकॉर्ड_गिनती
Sys.dm_db_index_physical_stats से
(DB_ID(N"tsql"), OBJECT_ID(N"dbo.NCI"), NULL, NULL , "विस्तृत");

-- अनुक्रमणिका हटाना
यदि मौजूद है (sys.indexes से नाम चुनें
जहां नाम = N"IX_1")
tsql.dbo.NCI पर ड्रॉप इंडेक्स IX_1;

यदि मौजूद है (sys.indexes से नाम चुनें
जहां नाम = N"IX_2")
tsql.dbo.NCI पर ड्रॉप इंडेक्स IX_2;

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

मैं आपको स्टाफ़ टेबल स्कीमा की परिभाषा याद दिलाना चाहता हूँ जिसके साथ हम काम करेंगे:

कर्मचारी तालिका

मान लीजिए कि हमें स्टाफ़ तालिका के लिए एक गैर-संकुलित सूचकांक बनाने की आवश्यकता है, जो निम्नलिखित क्वेरी को अनुकूलित करेगा:

उन सामग्रियों से आईडी, नाम, नौकरी चुनें जहां वेतन > 1000 और फोटो शून्य नहीं है

सूचकांक कुंजी वेतन और फोटो कॉलम होगी, क्योंकि चयन इन क्षेत्रों द्वारा फ़िल्टर किया जाता है। और आईडी, नाम और नौकरी कॉलम सूचकांक में शामिल कॉलम होंगे।

सामान्य कमांड सिंटैक्स इस प्रकार है:

उपयोग जाना

गैर-संकुलित सूचकांक बनाएं पर (एएससी - सूचकांक कुंजी कॉलम)

शामिल करना ( - कॉलम शामिल) जाओ

हमारे मामले में, अनुरोध इस तरह दिखेगा:

(वेतन, फोटो) शामिल करें (आईडी, नाम, नौकरी) जाओ

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

यदि हमारा कोड इस प्रकार होता:

सामान पर नॉनक्लस्टर्ड इंडेक्स IDX_StaffsSearch बनाएं

(वेतन, फोटो) शामिल करें (आईडी) जाओ

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

क्लस्टर्ड इंडेक्स निम्नलिखित कमांड का उपयोग करके बनाया गया है:

सामान पर क्लस्टर्ड इंडेक्स IDX_Stsffsid बनाएं (आईडी)

यहां तालिका की प्राथमिक कुंजी (आईडी कॉलम) के आधार पर एक अद्वितीय क्लस्टर इंडेक्स बनाया गया था।

वास्तविक उदाहरण

आइए अब एक ऐसा परिदृश्य विकसित करें जिसमें हम इंडेक्स का उपयोग करने के मामले में प्रदर्शन लाभ की डिग्री का वास्तविक मूल्यांकन कर सकें।

आइए एक नया डेटाबेस बनाएं:

डेटाबेस TestDB बनाएँ;

और एक एकल ग्राहक तालिका, जिसमें चार कॉलम होंगे:

तालिका बनाएं ।(

शून्य नहीं, शून्य, शून्य, शून्य) जाओ

आइए अब अपनी तालिका को यादृच्छिक डेटा से भरें। आईडी कॉलम को एक लूप में बढ़ाया जाएगा, और तालिका के शेष तीन कॉलम यादृच्छिक फ़ंक्शन के एक विशिष्ट संस्करण का उपयोग करके यादृच्छिक संख्याओं से भरे जाएंगे:

घोषित करें @i int = 0;

मैं जबकि< 500000) BEGIN INSERT INTO Customers(Id, Num1, Num2, Num3) VALUES(

@i, abs(checksum(newid())), abs(checksum(newid())), abs(checksum(newid())) SET @i = @i + 1; अंत

यह स्क्रिप्ट तालिका में पांच लाख रिकॉर्ड जोड़ती है, इसलिए धैर्य रखें, स्क्रिप्ट कम से कम 3 मिनट तक चलेगी।

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

सांख्यिकी संग्रह मोड को सक्षम करने के लिए, आपको निम्न आदेश चलाना होगा:

अब, प्रत्येक अनुरोध को निष्पादित करने के बाद, संदेश टैब पर हमारे पास इस अनुरोध के निष्पादन पर आंकड़ों तक पहुंच होगी, जैसा कि नीचे दिखाया गया है:

हम केवल तार्किक रीड पैरामीटर के मूल्य में रुचि रखते हैं।

इसलिए, हमारी तालिका में अभी तक कोई अनुक्रमणिका नहीं हैं। आइए निम्नलिखित तीन क्वेरीज़ चलाएँ और नीचे दी गई परिणाम तालिका में प्रत्येक क्वेरी के लिए तार्किक पढ़ने की संख्या रिकॉर्ड करें:

1) ग्राहकों से आईडी, संख्या 1, संख्या 2 चुनें जहां आईडी = 2000

2) उन ग्राहकों से आईडी, नंबर 1, नंबर 2 चुनें जहां आईडी >= 0 और आईडी है< 1000

3) उन ग्राहकों से आईडी, नंबर 1, नंबर 2 चुनें जहां आईडी >= 0 और आईडी है< 5000

ये क्वेरीज़ क्रमशः 1 पंक्ति, 1000 पंक्तियाँ और 5000 पंक्तियाँ लौटाएँगी। अनुक्रमणिका के बिना, सभी प्रश्नों के लिए प्रदर्शन संकेतक (तार्किक पढ़ने की संख्या) समान है और 1621 के बराबर है। आइए परिणाम तालिका में डेटा दर्ज करें:

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

आइए अब एक कवरिंग इंडेक्स बनाएं, जिससे अधिकतम प्रदर्शन प्राप्त हो सके।

सबसे पहले, आइए पिछली अनुक्रमणिका को हटाएँ:

टेस्टडीबी गो ड्रॉप इंडेक्स ग्राहक का उपयोग करें। टेस्टइंडेक्स1

और आइए एक नया सूचकांक बनाएं:

dbo.Customers(Id) INCLUDE (Num1, Num2) पर नॉनक्लस्टर्ड इंडेक्स TestIndex2 बनाएं;

आइए अब अपनी क्वेरीज़ को तीसरी बार चलाएं और परिणामों को एक तालिका में लिखें:

कोई अनुक्रमणिका नहीं

गैर-कवरिंग सूचकांक

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

यह देखना आसान है कि प्रदर्शन में भारी वृद्धि हुई है। इस प्रकार, हमने क्वेरी निष्पादन की गति को दसियों गुना बढ़ा दिया है। लाखों पंक्तियों को संग्रहीत करने वाला डेटाबेस चलाते समय, यह प्रदर्शन लाभ काफी ध्यान देने योग्य होगा।

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

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

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

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

उपयोगी सूचकांक

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

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

उन उत्पादों से हटाएँ जहाँ UnitPrice=1
उन उत्पादों में से * चुनें जहां इकाई मूल्य 14 और 16 के बीच है

क्योंकि इंडेक्स आइटम को क्रमबद्ध रूप से संग्रहित किया जाता है, ऑर्डर बाय क्लॉज का उपयोग करके क्वेरी बनाते समय इंडेक्सिंग भी उपयोगी होती है। इंडेक्स के बिना, क्वेरी चलने के दौरान रिकॉर्ड लोड और सॉर्ट किए जाते हैं। यूनिटप्राइस पर आधारित एक सूचकांक आपको अगले अनुरोध को संसाधित करते समय केवल सूचकांक को स्कैन करने और संदर्भ द्वारा पंक्तियों को पुनः प्राप्त करने की अनुमति देगा। यदि आप पंक्तियों को अवरोही क्रम में क्रमबद्ध करना चाहते हैं, तो आप बस सूचकांक को उल्टे क्रम में स्कैन कर सकते हैं।

UnitPrice ASC द्वारा उत्पाद ऑर्डर में से * चुनें

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

यूनिटप्राइस द्वारा उत्पाद समूह से गिनती(*), यूनिटप्राइस चुनें

इंडेक्स किसी कॉलम के लिए अद्वितीय मान बनाए रखने के लिए उपयोगी होते हैं, क्योंकि डीबीएमएस आसानी से इंडेक्स को देख सकता है कि मान पहले से मौजूद है या नहीं। इस कारण से, प्राथमिक कुंजियाँ हमेशा अनुक्रमित की जाती हैं।

इंडेक्सिंग के नुकसान

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

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

एक इष्टतम सूचकांक का निर्माण

सरल सूचकांक

एक साधारण सूचकांक एक सूचकांक है जो किसी तालिका में एकल फ़ील्ड के मानों का उपयोग करता है। एक साधारण सूचकांक का उपयोग करना दो कारणों से फायदेमंद है। सबसे पहले, डेटाबेस चलाने से आपकी हार्ड ड्राइव पर बहुत अधिक तनाव पड़ता है। बड़ी इंडेक्स कुंजियाँ डेटाबेस को अधिक I/O ऑपरेशन करने के लिए बाध्य करेंगी, जो प्रदर्शन को सीमित करती हैं।

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

चयनात्मक सूचकांक

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

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

सूचकांकों को कवर करना

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

आइए UnitPrice कॉलम पर एक इंडेक्स पर विचार करें, जिसका उल्लेख पहले ही ऊपर किया जा चुका है। DBMS अगली क्वेरी को निष्पादित करने के लिए केवल इंडेक्स आइटम का उपयोग कर सकता है।

यूनिटप्राइस द्वारा उत्पाद समूह से गणना(*), यूनिटप्राइस चुनें

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

क्लस्टर सूचकांक

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

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

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

निष्कर्ष

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

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

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


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

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

सूचकांक के प्रकार

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

डिज़ाइनिंग इंडेक्स

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

और अब, वास्तव में:

SQL सर्वर में इंडेक्स के बारे में 14 प्रश्न जिन्हें पूछने में आपको शर्मिंदगी हुई

किसी तालिका में दो संकुल अनुक्रमित क्यों नहीं हो सकते?

संक्षिप्त उत्तर चाहते हैं? क्लस्टर्ड इंडेक्स एक तालिका है। जब आप किसी तालिका पर क्लस्टर्ड इंडेक्स बनाते हैं, तो स्टोरेज इंजन इंडेक्स परिभाषा के अनुसार तालिका में सभी पंक्तियों को आरोही या अवरोही क्रम में क्रमबद्ध करता है। क्लस्टर्ड इंडेक्स अन्य इंडेक्स की तरह एक अलग इकाई नहीं है, बल्कि एक तालिका में डेटा को सॉर्ट करने और डेटा पंक्तियों तक त्वरित पहुंच की सुविधा प्रदान करने के लिए एक तंत्र है।
आइए कल्पना करें कि आपके पास बिक्री लेनदेन के इतिहास वाली एक तालिका है। बिक्री तालिका में ऑर्डर आईडी, ऑर्डर में उत्पाद की स्थिति, उत्पाद संख्या, उत्पाद की मात्रा, ऑर्डर संख्या और तारीख आदि जैसी जानकारी शामिल होती है। आप स्तंभों पर एक संकुल अनुक्रमणिका बनाते हैं आदेश कामतत्वऔर लाइन आईडी, आरोही क्रम में क्रमबद्ध जैसा कि निम्नलिखित में दिखाया गया है टी-एसक्यूएलकोड:
dbo.Sales(OrderID, LineID) पर अद्वितीय क्लस्टर इंडेक्स ix_oriderid_lineid बनाएं;
जब आप इस स्क्रिप्ट को चलाते हैं, तो तालिका में सभी पंक्तियों को पहले ऑर्डरआईडी कॉलम और फिर लाइनआईडी द्वारा भौतिक रूप से क्रमबद्ध किया जाएगा, लेकिन डेटा स्वयं एक तार्किक ब्लॉक, तालिका में रहेगा। इस कारण से, आप दो क्लस्टर्ड इंडेक्स नहीं बना सकते। एक डेटा वाली केवल एक तालिका हो सकती है और उस तालिका को एक विशिष्ट क्रम में केवल एक बार क्रमबद्ध किया जा सकता है।

यदि एक क्लस्टर्ड टेबल कई लाभ प्रदान करती है, तो ढेर का उपयोग क्यों करें?

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

मैं डिफ़ॉल्ट सूचकांक भरण कारक कैसे बदलूं?

डिफ़ॉल्ट इंडेक्स भरण कारक को बदलना एक बात है। यह समझना दूसरी बात है कि डिफ़ॉल्ट अनुपात कैसे काम करता है। लेकिन पहले, कुछ कदम पीछे हटें। सूचकांक भरण कारक एक नया पृष्ठ भरना शुरू करने से पहले सूचकांक को निचले स्तर (पत्ती स्तर) पर संग्रहीत करने के लिए पृष्ठ पर स्थान की मात्रा निर्धारित करता है। उदाहरण के लिए, यदि गुणांक 90 पर सेट है, तो जब सूचकांक बढ़ता है, तो यह पृष्ठ के 90% हिस्से पर कब्जा कर लेगा और फिर अगले पृष्ठ पर चला जाएगा।
डिफ़ॉल्ट रूप से, सूचकांक भरण कारक मान अंदर है एस क्यू एल सर्वर 0 है, जो 100 के समान है। परिणामस्वरूप, सभी नए सूचकांक स्वचालित रूप से इस सेटिंग को प्राप्त करते हैं जब तक कि आप विशेष रूप से अपने कोड में एक मान निर्दिष्ट नहीं करते हैं जो सिस्टम मानक मान से अलग है या डिफ़ॉल्ट व्यवहार को नहीं बदलता है। आप उपयोग कर सकते हैं SQL सर्वर प्रबंधन स्टूडियोडिफ़ॉल्ट मान को समायोजित करने या सिस्टम संग्रहीत प्रक्रिया चलाने के लिए sp_configure. उदाहरण के लिए, निम्नलिखित सेट टी-एसक्यूएलकमांड गुणांक मान को 90 पर सेट करता है (आपको पहले उन्नत सेटिंग्स मोड पर स्विच करना होगा):
EXEC sp_configure "उन्नत विकल्प दिखाएं", 1; पुनः कॉन्फ़िगर करें; GO EXEC sp_configure "भरण कारक", 90; पुनः कॉन्फ़िगर करें; जाना
इंडेक्स भरण कारक मान को बदलने के बाद, आपको सेवा को पुनः आरंभ करने की आवश्यकता है एस क्यू एल सर्वर. अब आप निर्दिष्ट दूसरे तर्क के बिना sp_configure चलाकर सेट मान की जांच कर सकते हैं:
EXEC sp_configure "भरण कारक" GO
इस कमांड को 90 का मान लौटाना चाहिए। परिणामस्वरूप, सभी नव निर्मित इंडेक्स इस मान का उपयोग करेंगे। आप एक इंडेक्स बनाकर और भरण कारक मान के लिए क्वेरी करके इसका परीक्षण कर सकते हैं:
एडवेंचरवर्क्स2012 का उपयोग करें; -- आपका डेटाबेस व्यक्ति.व्यक्ति(अंतिम नाम) पर गैर-संकुलित सूचकांक ix_people_lastname बनाएं; sys.indexes से fill_factor चुनें जहां object_id = object_id('Person.Person') और name='ix_people_lastname';
इस उदाहरण में, हमने एक टेबल पर एक गैर-क्लस्टर इंडेक्स बनाया व्यक्तिडेटाबेस में एडवेंचरवर्क्स2012. इंडेक्स बनाने के बाद, हम sys.indexes सिस्टम टेबल से भरण कारक मान प्राप्त कर सकते हैं। क्वेरी 90 पर वापस आनी चाहिए.
हालाँकि, आइए कल्पना करें कि हमने सूचकांक को हटा दिया और इसे फिर से बनाया, लेकिन अब हमने एक विशिष्ट भरण कारक मान निर्दिष्ट किया है:
(भरणकारक=80) के साथ व्यक्ति.व्यक्ति(अंतिमनाम) पर गैर-संकुलित सूचकांक ix_people_lastname बनाएं; Sys.indexes से fill_factor चुनें जहां object_id = object_id('Person.Person') और name='ix_people_lastname';
इस बार हमने निर्देश जोड़े हैं साथऔर विकल्प कारक भरनेहमारे सूचकांक निर्माण ऑपरेशन के लिए सूचकांक बनाएंऔर मान 80 निर्दिष्ट किया। ऑपरेटर चुननाअब संबंधित मान लौटाता है।
अब तक सब कुछ बहुत सीधा-सरल रहा है। इस पूरी प्रक्रिया में आप वास्तव में परेशान हो सकते हैं, जब आप एक सूचकांक बनाते हैं जो डिफ़ॉल्ट गुणांक मान का उपयोग करता है, यह मानते हुए कि आप उस मान को जानते हैं। उदाहरण के लिए, कोई व्यक्ति सर्वर सेटिंग्स के साथ छेड़छाड़ कर रहा है और इतना जिद्दी है कि उसने इंडेक्स भरण कारक को 20 पर सेट कर दिया है। इस बीच, आप इंडेक्स बनाना जारी रखते हैं, यह मानते हुए कि डिफ़ॉल्ट मान 0 है। दुर्भाग्य से, आपके पास भरण का पता लगाने का कोई तरीका नहीं है जब तक आप एक सूचकांक नहीं बनाते तब तक कारक बनाएं और फिर मूल्य की जांच करें जैसे हमने अपने उदाहरणों में किया था। अन्यथा, आपको उस क्षण का इंतजार करना होगा जब क्वेरी का प्रदर्शन इतना गिर जाएगा कि आपको कुछ संदेह होने लगेगा।
एक अन्य मुद्दा जिसके बारे में आपको अवगत होना चाहिए वह है अनुक्रमणिका का पुनर्निर्माण। एक इंडेक्स बनाने की तरह, जब आप इसका पुनर्निर्माण करते हैं तो आप इंडेक्स भरण कारक मान निर्दिष्ट कर सकते हैं। हालाँकि, क्रिएट इंडेक्स कमांड के विपरीत, रीबिल्ड सर्वर डिफ़ॉल्ट सेटिंग्स का उपयोग नहीं करता है, भले ही यह कैसा भी लगे। इससे भी अधिक, यदि आप विशेष रूप से सूचकांक भरण कारक मान निर्दिष्ट नहीं करते हैं एस क्यू एल सर्वरउस गुणांक के मान का उपयोग करेगा जिसके साथ यह सूचकांक इसके पुनर्गठन से पहले मौजूद था। उदाहरण के लिए, निम्नलिखित ऑपरेशन सूचकांक बदलेंहमारे द्वारा अभी बनाए गए सूचकांक का पुनर्निर्माण करता है:
व्यक्ति.व्यक्ति पुनर्निर्माण पर सूचकांक ix_people_अंतिम नाम बदलें; Sys.indexes से fill_factor चुनें जहां object_id = object_id('Person.Person') और name='ix_people_lastname';
जब हम भरण कारक मान की जांच करते हैं, तो हमें 80 का मान मिलेगा, क्योंकि हमने पिछली बार सूचकांक बनाते समय यही निर्दिष्ट किया था। डिफ़ॉल्ट मान को अनदेखा कर दिया जाता है.
जैसा कि आप देख सकते हैं, इंडेक्स भरण कारक मान को बदलना उतना मुश्किल नहीं है। वर्तमान मूल्य को जानना और जब इसे लागू किया जाता है तो समझना अधिक कठिन होता है। यदि आप इंडेक्स बनाते और पुनर्निर्माण करते समय हमेशा विशेष रूप से गुणांक निर्दिष्ट करते हैं, तो आप हमेशा विशिष्ट परिणाम जानते हैं। जब तक आपको यह सुनिश्चित करने के बारे में चिंता करने की ज़रूरत नहीं है कि कोई अन्य व्यक्ति सर्वर सेटिंग्स को फिर से खराब न कर दे, जिससे सभी इंडेक्स को हास्यास्पद रूप से कम इंडेक्स भरण कारक के साथ फिर से बनाया जा सके।

क्या डुप्लिकेट वाले कॉलम पर क्लस्टर्ड इंडेक्स बनाना संभव है?

हां और ना। हाँ, आप कुंजी कॉलम पर एक क्लस्टर्ड इंडेक्स बना सकते हैं जिसमें डुप्लिकेट मान हों। नहीं, कुंजी कॉलम का मान गैर-विशिष्ट स्थिति में नहीं रह सकता है। मुझे समझाने दो। यदि आप किसी कॉलम पर एक गैर-अद्वितीय क्लस्टर इंडेक्स बनाते हैं, तो स्टोरेज इंजन विशिष्टता सुनिश्चित करने के लिए डुप्लिकेट मान में एक यूनिक्विफायर जोड़ता है और इसलिए क्लस्टर तालिका में प्रत्येक पंक्ति की पहचान करने में सक्षम होता है।
उदाहरण के लिए, आप ग्राहक डेटा वाले कॉलम पर क्लस्टर्ड इंडेक्स बनाने का निर्णय ले सकते हैं उपनामउपनाम रखना. कॉलम में फ्रैंकलिन, हैनकॉक, वाशिंगटन और स्मिथ के मान शामिल हैं। फिर आप एडम्स, हैनकॉक, स्मिथ और स्मिथ मान फिर से डालें। लेकिन कुंजी कॉलम का मान अद्वितीय होना चाहिए, इसलिए स्टोरेज इंजन डुप्लिकेट के मान को बदल देगा ताकि वे कुछ इस तरह दिखें: एडम्स, फ्रैंकलिन, हैनकॉक, हैनकॉक1234, वाशिंगटन, स्मिथ, स्मिथ4567 और स्मिथ5678।
पहली नज़र में, यह दृष्टिकोण ठीक लगता है, लेकिन एक पूर्णांक मान कुंजी के आकार को बढ़ाता है, जो बड़ी संख्या में डुप्लिकेट होने पर एक समस्या बन सकता है, और ये मान एक गैर-संकुल सूचकांक या विदेशी का आधार बन जाएंगे मुख्य संदर्भ. इन कारणों से, जब भी संभव हो आपको हमेशा अद्वितीय क्लस्टर्ड इंडेक्स बनाने का प्रयास करना चाहिए। यदि यह संभव नहीं है, तो कम से कम बहुत अधिक अद्वितीय मूल्य सामग्री वाले कॉलम का उपयोग करने का प्रयास करें।

यदि क्लस्टर्ड इंडेक्स नहीं बनाया गया है तो तालिका कैसे संग्रहीत की जाती है?

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

मूल्य विशिष्टता बाधाओं और तालिका अनुक्रमणिका के साथ प्राथमिक कुंजी के बीच क्या संबंध है?

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

SQL सर्वर में क्लस्टर्ड और नॉन-क्लस्टर्ड इंडेक्स को B-ट्री क्यों कहा जाता है?

SQL सर्वर में मूल इंडेक्स, क्लस्टर्ड या नॉनक्लस्टर्ड, पेजों के सेट में वितरित किए जाते हैं जिन्हें इंडेक्स नोड्स कहा जाता है। ये पृष्ठ एक विशिष्ट पदानुक्रम में एक वृक्ष संरचना के साथ व्यवस्थित होते हैं जिसे संतुलित वृक्ष कहा जाता है। शीर्ष स्तर पर रूट नोड है, नीचे लीफ नोड्स हैं, ऊपर और नीचे के स्तर के बीच मध्यवर्ती नोड्स हैं, जैसा कि चित्र में दिखाया गया है:


रूट नोड इंडेक्स के माध्यम से डेटा पुनर्प्राप्त करने का प्रयास करने वाले प्रश्नों के लिए मुख्य प्रवेश बिंदु प्रदान करता है। इस नोड से शुरू करके, क्वेरी इंजन पदानुक्रमित संरचना के नीचे डेटा वाले उपयुक्त लीफ नोड तक एक नेविगेशन शुरू करता है।
उदाहरण के लिए, कल्पना करें कि 82 के मुख्य मान वाली पंक्तियों का चयन करने का अनुरोध प्राप्त हुआ है। क्वेरी सबसिस्टम रूट नोड से काम करना शुरू करता है, जो हमारे मामले में 1-100 में एक उपयुक्त मध्यवर्ती नोड को संदर्भित करता है। मध्यवर्ती नोड 1-100 से नोड 51-100 तक संक्रमण होता है, और वहां से अंतिम नोड 76-100 तक। यदि यह एक क्लस्टर्ड इंडेक्स है, तो नोड लीफ में 82 के बराबर कुंजी से जुड़ी पंक्ति का डेटा होता है। यदि यह एक गैर-क्लस्टर इंडेक्स है, तो इंडेक्स लीफ में क्लस्टर्ड टेबल या एक विशिष्ट पंक्ति के लिए एक पॉइंटर होता है ढेर.

यदि आपको इन सभी इंडेक्स नोड्स को पार करना है तो एक इंडेक्स क्वेरी प्रदर्शन में सुधार कैसे कर सकता है?

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

यदि अनुक्रमणिकाएँ इतनी बढ़िया हैं, तो प्रत्येक स्तंभ पर एक क्यों नहीं बनाई जाती?

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

क्या प्राथमिक कुंजी वाले कॉलम पर क्लस्टर्ड इंडेक्स बनाना आवश्यक है?

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

यदि आप किसी दृश्य को अनुक्रमित करते हैं, तो क्या यह अभी भी एक दृश्य है?

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

समग्र सूचकांक के बजाय कवरिंग सूचकांक का उपयोग क्यों करें?

सबसे पहले, आइए सुनिश्चित करें कि हम दोनों के बीच अंतर को समझें। एक कंपाउंड इंडेक्स बस एक नियमित इंडेक्स होता है जिसमें एक से अधिक कॉलम होते हैं। यह सुनिश्चित करने के लिए कि तालिका में प्रत्येक पंक्ति अद्वितीय है, एकाधिक कुंजी कॉलम का उपयोग किया जा सकता है, या यह सुनिश्चित करने के लिए कि प्राथमिक कुंजी अद्वितीय है, आपके पास कई कॉलम हो सकते हैं, या आप एकाधिक कॉलम पर अक्सर पूछे जाने वाले प्रश्नों के निष्पादन को अनुकूलित करने का प्रयास कर सकते हैं। हालाँकि, सामान्य तौर पर, किसी सूचकांक में जितने अधिक प्रमुख कॉलम होंगे, सूचकांक उतना ही कम कुशल होगा, जिसका अर्थ है कि समग्र सूचकांक का उपयोग विवेकपूर्ण तरीके से किया जाना चाहिए।
जैसा कि कहा गया है, एक क्वेरी बहुत फायदेमंद हो सकती है यदि सभी आवश्यक डेटा तुरंत इंडेक्स की पत्तियों पर स्थित हो, बिल्कुल इंडेक्स की तरह। यह क्लस्टर्ड इंडेक्स के लिए कोई समस्या नहीं है क्योंकि सारा डेटा पहले से ही मौजूद है (यही कारण है कि जब आप क्लस्टर्ड इंडेक्स बनाते हैं तो सावधानी से सोचना इतना महत्वपूर्ण है)। लेकिन पत्तियों पर एक गैर-संकुल सूचकांक में केवल प्रमुख कॉलम होते हैं। अन्य सभी डेटा तक पहुंचने के लिए, क्वेरी ऑप्टिमाइज़र को अतिरिक्त चरणों की आवश्यकता होती है, जो आपके प्रश्नों को निष्पादित करने में महत्वपूर्ण ओवरहेड जोड़ सकता है।
यहीं पर कवरिंग इंडेक्स बचाव के लिए आता है। जब आप एक गैर-संकुल सूचकांक को परिभाषित करते हैं, तो आप अपने मुख्य कॉलम में अतिरिक्त कॉलम निर्दिष्ट कर सकते हैं। उदाहरण के लिए, मान लें कि आपका एप्लिकेशन अक्सर कॉलम डेटा पर क्वेरी करता है आदेश कामतत्वऔर आर्डर की तारीखमेज पर बिक्री:
बिक्री से ऑर्डर आईडी, ऑर्डर दिनांक चुनें जहां ऑर्डर आईडी = 12345;
आप दोनों कॉलमों पर एक मिश्रित गैर-क्लस्टर इंडेक्स बना सकते हैं, लेकिन ऑर्डरडेट कॉलम विशेष रूप से उपयोगी कुंजी कॉलम के रूप में कार्य किए बिना केवल इंडेक्स रखरखाव ओवरहेड जोड़ देगा। सबसे अच्छा समाधान कुंजी कॉलम पर एक कवरिंग इंडेक्स बनाना होगा आदेश कामतत्वऔर इसके अतिरिक्त कॉलम भी शामिल है आर्डर की तारीख:
dbo.Sales(OrderID) पर गैर-संकुलित सूचकांक ix_orderid बनाएं INCLUDE (OrderDate);
यह क्वेरी चलाने के दौरान पत्तों में डेटा संग्रहीत करने के लाभों को बनाए रखते हुए अनावश्यक कॉलमों को अनुक्रमित करने के नुकसान से बचाता है। शामिल कॉलम कुंजी का हिस्सा नहीं है, लेकिन डेटा लीफ नोड, इंडेक्स लीफ पर संग्रहीत है। यह बिना किसी अतिरिक्त ओवरहेड के क्वेरी प्रदर्शन में सुधार कर सकता है। इसके अलावा, कवरिंग इंडेक्स में शामिल कॉलम इंडेक्स के प्रमुख कॉलम की तुलना में कम प्रतिबंधों के अधीन हैं।

क्या कुंजी कॉलम में डुप्लिकेट की संख्या मायने रखती है?

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

क्या किसी कुंजी स्तंभ के डेटा के केवल एक विशिष्ट उपसमूह पर एक गैर-संकुल सूचकांक बनाना संभव है?

डिफ़ॉल्ट रूप से, एक गैर-संकुलित सूचकांक में तालिका में प्रत्येक पंक्ति के लिए एक पंक्ति होती है। निःसंदेह, आप क्लस्टर्ड इंडेक्स के बारे में भी यही बात कह सकते हैं, यह मानते हुए कि ऐसा इंडेक्स एक तालिका है। लेकिन जब गैर-संकुल सूचकांक की बात आती है, तो एक-से-एक संबंध एक महत्वपूर्ण अवधारणा है क्योंकि, संस्करण से शुरू होता है एसक्यूएल सर्वर 2008, आपके पास एक फ़िल्टर करने योग्य इंडेक्स बनाने का विकल्प है जो इसमें शामिल पंक्तियों को सीमित करता है। फ़िल्टर किया गया इंडेक्स क्वेरी प्रदर्शन में सुधार कर सकता है क्योंकि... यह आकार में छोटा है और इसमें सभी तालिकाओं की तुलना में फ़िल्टर किए गए, अधिक सटीक आँकड़े शामिल हैं - इससे बेहतर निष्पादन योजनाओं का निर्माण होता है। फ़िल्टर किए गए इंडेक्स के लिए कम भंडारण स्थान और कम रखरखाव लागत की भी आवश्यकता होती है। इंडेक्स तभी अपडेट किया जाता है जब फ़िल्टर से मेल खाने वाला डेटा बदल जाता है।
इसके अलावा, फ़िल्टर करने योग्य इंडेक्स बनाना आसान है। ऑपरेटर में सूचकांक बनाएंआपको बस इसमें संकेत देना होगा कहाँफ़िल्टर की स्थिति. उदाहरण के लिए, आप इंडेक्स से NULL वाली सभी पंक्तियों को फ़िल्टर कर सकते हैं, जैसा कि कोड में दिखाया गया है:
Sales.SalesOrderDetail(CarrierTrackingNumber) पर नॉनक्लस्टर्ड इंडेक्स ix_trackingnumber बनाएं, जहां कैरियरट्रैकिंगनंबर शून्य नहीं है;
वास्तव में, हम किसी भी डेटा को फ़िल्टर कर सकते हैं जो महत्वपूर्ण प्रश्नों में महत्वपूर्ण नहीं है। लेकिन सावधान रहें, क्योंकि... एस क्यू एल सर्वरफ़िल्टर करने योग्य इंडेक्स पर कई प्रतिबंध लगाता है, जैसे किसी दृश्य पर फ़िल्टर करने योग्य इंडेक्स बनाने में असमर्थता, इसलिए दस्तावेज़ को ध्यान से पढ़ें।
यह भी हो सकता है कि आप अनुक्रमित दृश्य बनाकर समान परिणाम प्राप्त कर सकें। हालाँकि, फ़िल्टर किए गए इंडेक्स के कई फायदे हैं, जैसे रखरखाव लागत को कम करने और आपकी निष्पादन योजनाओं की गुणवत्ता में सुधार करने की क्षमता। फ़िल्टर किए गए अनुक्रमणिका को ऑनलाइन भी पुनः बनाया जा सकता है। इसे अनुक्रमित दृश्य के साथ आज़माएँ।

और फिर से अनुवादक से थोड़ा सा

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

जैसा कि वादा किया गया था, किताबें उन लोगों के लिए जो अधिक जानना चाहते हैं
मैं अपनी ओर से तीन बहुत अच्छी पुस्तकों की अनुशंसा करता हूं (लिंक आगे बढ़ते हैं प्रज्वलित करनास्टोर में संस्करण वीरांगना):

सिद्धांत रूप में, आप सरल अनुक्रमणिका खोल सकते हैं
  • नौसिखिये के लिए
  • अनुक्रमणिका
  • टैगों को जोड़ें
    Microsoft SQL सर्वर 2012 T-SQL बुनियादी बातें (डेवलपर संदर्भ)
    लेखक इत्ज़िक बेन-गण
    प्रकाशन दिनांक: 15 जुलाई 2012
    लेखक, अपनी कला में निपुण, डेटाबेस के साथ काम करने के बारे में बुनियादी ज्ञान प्रदान करता है।
    यदि आप सब कुछ भूल गए हैं या कभी नहीं जानते हैं, तो यह निश्चित रूप से पढ़ने लायक है।

    ROWID अनुक्रमणिकाडेटाबेस ऑब्जेक्ट हैं जो तालिका कॉलम में सभी मानों का प्रदर्शन प्रदान करते हैं, साथ ही तालिका में सभी पंक्तियों के ROWID जिनमें कॉलम के मान शामिल होते हैं।

    ROWIDएक छद्म-स्तंभ है जो तालिका में एक पंक्ति के लिए एक अद्वितीय पहचानकर्ता है और वास्तव में उस विशेष पंक्ति के सटीक भौतिक स्थान का वर्णन करता है। इस जानकारी के आधार पर आकाशवाणीबाद में तालिका पंक्ति से संबद्ध डेटा पा सकते हैं। हर बार जब एक पंक्ति को स्थानांतरित किया जाता है, निर्यात किया जाता है, आयात किया जाता है, या कोई अन्य ऑपरेशन किया जाता है जो उसका स्थान बदलता है, तो ROWIDरेखा क्योंकि यह एक भिन्न भौतिक स्थिति रखती है। डेटा भंडारण के लिए ROWID 80 बिट्स (10 बाइट्स) की आवश्यकता है। पहचानकर्ता ROWIDइसमें चार घटक शामिल हैं: ऑब्जेक्ट नंबर (32 बिट्स), सापेक्ष फ़ाइल नंबर (10 बिट्स), ब्लॉक नंबर (22 बिट्स) और लाइन नंबर (16 बिट्स)। इन पहचानकर्ताओं को डेटाबेस में डेटा के स्थान को इंगित करने वाले 18-वर्ण अनुक्रम के रूप में प्रदर्शित किया जाता है, प्रत्येक वर्ण को बेस -64 प्रारूप में दर्शाया जाता है जिसमें वर्ण A-Z, a-z, 0-9, + और / शामिल होते हैं। पहले छह अक्षर डेटा ऑब्जेक्ट नंबर हैं, अगले तीन संबंधित फ़ाइल नंबर हैं, अगले छह ब्लॉक नंबर हैं, और अंतिम तीन लाइन नंबर हैं।

    उदाहरण:

    परिवार का चयन करें, ROWIDविद्यार्थी से;

    परिवार ROWID

    ——————————————

    इवानोव AAAA3kAAGAAAAGsAAA

    पेत्रोव AAAA3kAAGAAAAGsAAB

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

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

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