2012-12-26 20 views
6

मान लीजिए मैं तालिका निम्नलिखित है एक स्तंभ के लिए कई nonclustered अनुक्रमणिका बनाने के लिए सिर्फ एक सूचकांक में एकाधिक स्तंभों होने बनामएसक्यूएल सर्वर

  • UserID (पहचान) पीके
  • UserName - अद्वितीय गैर अशक्त
  • UserEmail - अद्वितीय गैर शून्य

सर्वोत्तम प्रदर्शन के लिए क्या अनुशंसा की जाती है?

  • UserName के लिए गैर क्लस्टर सूचकांक और UserEmail अलग

या

  • बस एक दोनों स्तंभों सहित बनाने

कृपया आप विचारों को साझा क्यों एक से अधिक पसंद किया जाता है अन्य।

उत्तर

12

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

तो यदि आपके पास

पर एक एकल यौगिक अनुक्रमणिका है
(UserID, UserName, UserEmail) 

तो यह सूचकांक निम्न परिदृश्यों में इस्तेमाल किया जा सकता है:

  • जब तुम अकेले UserID लिए खोज कर रहे (सिर्फ 1 सबसे बाईं ओर स्तंभ का उपयोग - UserID)
  • जब आप कर रहे हैं UserID और UserName
  • (2 सबसे बाईं ओर स्तंभों का उपयोग) के लिए खोज जब आप सभी तीन स्तंभों के लिए खोज कर रहे हैं

लेकिन यह एक यौगिक सूचकांक कभी नहीं में सक्षम हो जाएगा

  • सिर्फ UserName पर खोजों के लिए प्रयोग की जाने वाली है - यह सूचकांक में दूसरे स्तंभ है और इस तरह यह सूचकांक नहीं कभी
  • सिर्फ इस्तेमाल किया जा सकता है UserEmail - यह सूचकांक में तीसरे स्तंभ है और इस तरह यह सूचकांक कभी

जू नहीं किया जा सकता है यह याद रखें - सिर्फ इसलिए कि एक सूचकांक में एक स्तंभ भाग है, इसका मतलब यह नहीं है कि अकेले उस एकल कॉलम पर खोज का समर्थन किया जाएगा और उस इंडेक्स द्वारा बढ़ाया जाएगा!

इसलिए यदि आपके उपयोग प्रतिमानों और आपके आवेदन वास्तव में (अन्य खोज मान प्रदान के बिना) UserName और/या UserEmail अकेले पर खोज करने के लिए की जरूरत है, तो आप अलग सूचकांक इन स्तंभों पर बनाना होगा - बस एक ही परिसर से एक होगा पर कोई लाभ नहीं है।

4

इंडेक्स को परिभाषित करने का सबसे अच्छा तरीका पूरी तरह से निर्भर करता है कि आप तालिका का उपयोग कैसे करेंगे। टेबल परिभाषा को देखकर इंडेक्स चुनने का कोई समझदार तरीका नहीं है।

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

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

2

कृपया आपको विचार करें कि एक दूसरे के ऊपर क्यों बेहतर है।

यह आपके काम पर निर्भर करता है।

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

  • Uniuqe सूचकांक, UserID में क्लस्टर किया गया, प्राथमिक कुंजी के रूप:

    आम तौर पर, मैं यहाँ तीन सूचकांकों ग्रहण करेंगे।

  • उपयोगकर्ता नाम पर अद्वितीय इंडेक्स, गैर क्लस्टर।
  • उपयोगकर्तामेल पर अनन्य इंडेक्स, गैर क्लस्टर।

कारण पूरी तरह से नहीं है प्रदर्शन के लिए लेकिन:

  • आप forein कुंजी संबंधों के लिए प्राथमिक कुंजी के रूप में पहली आवश्यकता होगी।
  • आपको अनन्य बाधाओं को सही तरीके से संभालने के लिए अन्य दो की आवश्यकता है - सूचकांक के बिना ऐसा करने का कोई तरीका नहीं है।

अतिरिक्त में, आपको उपयोगकर्ता नाम और उपयोगकर्तामेल की तलाश करने के लिए लचीलापन की आवश्यकता है, जिसका अर्थ है कि उन्हें केवल संयोजित करना संभव नहीं है।

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

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