2011-07-06 16 views
58

कर्मचारी तालिका में कहें, मैंने तालिका के emp_name कॉलम पर एक अनुक्रमणिका (idx_name) बनाई है।चयन कथन में अनुक्रमणिका का उपयोग कैसे करें?

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

यदि यह चयन खंड में निर्दिष्ट होना आवश्यक है, तो चयन क्वेरी में अनुक्रमणिका का उपयोग करने के लिए वाक्यविन्यास क्या है?

उत्तर

55

आप सूचकांक का परीक्षण करने के देखना चाहते हैं तो अगर यह, काम करता है यहां वाक्य रचना है:

SELECT * 
FROM Table WITH(INDEX(Index_Name)) 

के साथ बयान सूचकांक के लिए बाध्य करेगा प्रयोग की जाने वाली।

+40

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

2

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

SELECT * FROM TABLE WHERE attribute = 'value' 

उचित अनुक्रमणिका का उपयोग करेगा।

26

अच्छा सवाल है,

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

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

MySQL के लिए, आप कैसे इस

8

अनुकूलक निर्णय करेगा करने के लिए करता है, तो अपने सूचकांक का उपयोग अपनी क्वेरी के चलने तेजी से कर देगा पर Index Hint Syntax प्रलेखन पढ़ना चाहते हैं, और अगर यह है, यह सूचकांक का उपयोग करेगा ।

अपने आरडीबीएमएस के आधार पर आप एक सूचकांक के उपयोग को मजबूर कर सकते हैं, हालांकि यह तब तक अनुशंसित नहीं है जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं।

सामान्य तौर पर आप सूचकांक कॉलम आपके द्वारा तालिका के उपयोग करने के शामिल हो जाना चाहिए और जहां बयान

12

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

आपकी क्वेरी फार्म की है:

SELECT Name from Table where Name = 'Boris' 

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

यह एक विस्तृत तालिका (बहुत के स्तंभों में से) है और यदि आप करते हैं:

SELECT * from Table where Name = 'Boris' 

तो यह अभी भी, टेबल स्कैन के लिए चुन सकते हैं अगर यह एक उचित धारणा है कि यह अधिक समय पुन: प्राप्त करने लेने के लिए जा रहा है तालिका से अन्य कॉलम की तुलना में केवल नाम को देखना होगा, या फिर, यदि यह वैसे भी बहुत सारी पंक्तियों को पुनर्प्राप्त करने की संभावना है।

4

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

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

Index hintMySQL के लिए भी उपलब्ध है। ट्यूडर कॉन्स्टैंटिन के लिए धन्यवाद।

18

चयन कथन में अनुक्रमणिका का उपयोग कैसे करें?
इस तरह से:

SELECT * FROM table1 USE INDEX (col1_index,col2_index) 
    WHERE col1=1 AND col2=2 AND col3=3; 


SELECT * FROM table1 IGNORE INDEX (col3_index) 
WHERE col1=1 AND col2=2 AND col3=3; 


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2); 

और उतने ही तरीके जाँच this

क्या मुझे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है?

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