2008-12-05 25 views
7

के आदेश मैं एक मेज इसलिए की तरह है।एसक्यूएल सर्वर क्लस्टर सूचकांक सूचकांक प्रश्न

कुंजीबी के 5 संभावित मान हैं लेकिन keyA के संभावित मूल्यों की असीमित संख्या है। कुंजीबी आम तौर पर वृद्धि करता है।

उदाहरण के लिए, निम्न डेटा के आधार 2 तरीके जिस पर प्रमुख स्तंभ पहले आदेश दिया है में आदेश दिया जा सकता:

keyA keyB data 
A 1 X 
B 1 X 
A 3 X 
B 3 X 
A 5 X 
B 5 X 
A 7 X 
B 7 X 

या

keyA keyB data 
A 1 X 
A 3 X 
A 5 X 
A 7 X 
B 1 X 
B 3 X 
B 5 X 
B 7 X 

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

उत्तर

11

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

"बी * ट्री इंडेक्स उन प्रश्नों के प्रदर्शन में सुधार करता है जो तालिका से पंक्तियों का एक छोटा सा प्रतिशत चुनते हैं।" http://www.akadia.com/services/ora_index_selectivity.html?

यह आलेख ओरेकल के लिए है, लेकिन अभी भी प्रासंगिक है।

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

एक समग्र सूचकांक में पहले कॉलम का उल्लेख करना सुनिश्चित करने के लिए ligget78 की टिप्पणी याद रखना महत्वपूर्ण है।

+1

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

+0

-1: आप वास्तविक प्रश्न का उत्तर नहीं दे रहे हैं। आप कुछ चीजों का उल्लेख करते हैं जो सामान्य रूप से प्रदर्शन से संबंधित हैं, लेकिन वे यहां प्रासंगिक नहीं हैं। आप पहले पैराग्राफ के लिए शून्य तर्क प्रदान करते हैं * * * एक वैध उत्तर हो सकता है लेकिन यह खड़ा है जैसा कि यह खड़ा है। आपके द्वारा लिंक किया गया लेख या तो बहुत प्रासंगिक प्रतीत नहीं होता है। – MarioDS

0

सबसे अच्छी बात यह है कि आप दोनों समाधानों को आजमा सकते हैं और निष्पादन समय को माप सकते हैं।

मेरे अनुभव में, इंडेक्स ट्यूनिंग सटीक विज्ञान के अलावा सभी है।

हो सकता है कि सूचकांक स्तंभ क्रम होगा बेहतर

+1

यह वास्तव में ठोस वैज्ञानिक विचारों पर आधारित है। बी-पेड़ इंडेक्स कैसे काम करते हैं, इस बारे में कुछ सीखना आपको अधिक जानकारी देगा और कम अनुमानित काम की आवश्यकता होगी। ईमानदार होने के लिए – Sam

+0

+1। जब तक आप बिल्कुल नहीं जानते कि कैसे (उदा।) SQL सर्वर आंतरिक रूप से काम करता है, तो आप यह सुनिश्चित नहीं कर सकते कि अभ्यास में चीजें कैसे काम करती हैं। थ्योरी हालांकि महान है। नहीं, वास्तव में;) –

1

मेरा मानना ​​है कि में Keya से पहले KEYB होने कि एसक्यूएल सर्वर आदेश यह सटीक रूप से आपकी बताओ। यह मानता है कि आप जानते हैं कि अपनी अनुक्रमणिका का उपयोग कैसे करें।

किसी भी मामले में, मैं कहूंगा कि यह एक अच्छा विचार है कि डेटाबेस को यह समझने की अपेक्षा करने के बजाय आप वास्तव में क्या चाहते हैं यह निर्दिष्ट करना संभव है।

आप इसे दोनों तरीकों से भी आजमा सकते हैं, प्रतिनिधि प्रश्नों का एक समूह चला सकते हैं और फिर उत्पन्न निष्पादन योजनाओं की तुलना कर सकते हैं ताकि यह निर्धारित किया जा सके कि आपके लिए सबसे अच्छा क्या है।

+0

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

+0

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

7

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

यह प्रदर्शन के अनुसार महत्वपूर्ण हो सकता है, निश्चित रूप से आपकी क्वेरी पर निर्भर करता है। उदाहरण के लिए, यदि आपके पास (keyA, keyB) अनुक्रमणिका है और क्वेरी WHERE keyB = ... (keyA का उल्लेख किए बिना) की तरह दिखती है तो अनुक्रमणिका का उपयोग नहीं किया जा सकता है।

0

आप उस क्रम में कॉलम निर्दिष्ट करते हैं जिसमें आप आमतौर पर उन्हें रिपोर्ट और प्रश्नों में क्रमबद्ध करना चाहते हैं।

हालांकि मैं एक बहुआयामी क्लस्टर सूचकांक बनाने से सावधान रहूंगा। इस पर निर्भर करता है कि यह कितना व्यापक है, आप किसी भी अन्य इंडेक्स के आकार पर एक बड़ा प्रभाव डाल सकते हैं क्योंकि सभी गैर-क्लस्टर इंडेक्स में क्लस्टर इंडेक्स वैल्यू होता है। यदि मूल्य अक्सर बदलते हैं तो पंक्तियों को फिर से आदेश दिया जाना चाहिए और यह मेरा अनुभव है कि गैर-सरोगेट कुंजी अधिक बार बदलती रहती हैं। इसलिए इसे क्लस्टर्ड उपाध्यक्ष के रूप में बनाने से सर्वर संसाधनों का अधिक समय लग सकता है यदि आपके पास ऐसे मान हैं जो बदलने की संभावना है। मैं यह नहीं कह रहा हूं कि आपको ऐसा नहीं करना चाहिए क्योंकि मुझे नहीं पता कि आपके कॉलम में वास्तव में किस प्रकार का डेटा है (हालांकि मुझे संदेह है कि वे अधिक जटिल हैं ए 1, ए 2, आदि); मैं कह रहा हूं कि आपको ऐसा करने की विधियों के बारे में सोचना चाहिए। ऐसा करने से पहले क्लस्टर किए गए उपाध्यक्ष न किए गए इंडेक्स के बारे में बीओएल को अच्छी तरह से पढ़ना शायद एक अच्छा विचार होगा।

2

जैसा कि अन्य ने कहा है, ऑर्डरिंग इस पर आधारित है कि आप इसे इंडेक्स निर्माण स्क्रिप्ट (या पीके बाधा) में कैसे निर्दिष्ट करते हैं। क्लस्टर्ड इंडेक्स के बारे में एक बात यह है कि ध्यान में रखना बहुत कुछ है।

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

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

छोटी लुक-अप टेबल के लिए मैं हमेशा पीके पर क्लस्टर इंडेक्स डालता हूं। उच्च प्रभाव वाली टेबलों के लिए हालांकि सबसे अच्छा चुनने से पहले विभिन्न संभव क्लस्टर्ड इंडेक्स के बारे में सोचने (और परीक्षण) के बारे में सोचने का समय बिताना एक अच्छा विचार है।

0

याद रखें कि क्लस्टर सूचकांक भौतिक क्रम है जिसमें तालिका डिस्क पर संग्रहीत होती है।

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

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

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

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

1

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

आपके प्रश्नों, आप अभी भी, जोड़ना होगा एक

ORDER BY KeyA, KeyB 

या

ORDER BY KeyB, KeyA 

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

0

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

http://ashishkhandelwal.arkutil.com/sql-server/quick-and-short-database-indexes/

  • उत्तम आचरण अनुक्रमित
  • का उपयोग कैसे करें
  • क्लस्टर सूचकांक संबंधी सर्वश्रेष्ठ प्रदर्शन के रूप अनुक्रमित पाने के लिए
  • Nonclustered इंडेक्स विचार

मुझे यकीन है कि इंडेक्स की योजना बनाते समय यह आपकी मदद करेगा।

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