इंडेक्स का चयन स्टेटमेंट में कैसे करें?


97

कर्मचारी तालिका में कहते हैं, मैंने तालिका के emp_nameस्तंभ पर एक सूचकांक (idx_name) बनाया है ।

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

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

जवाबों:


86

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

SELECT *
FROM Table WITH(INDEX(Index_Name))

स्टेटमेंट के साथ इंडेक्स का उपयोग करने के लिए बाध्य करेगा।


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

34

अच्छा प्रश्न,

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

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

MySQL के लिए, आप यह कैसे करना है पर सूचकांक संकेत सिंटैक्स प्रलेखन को पढ़ना चाहते हैं


30

इंडेक्स का चयन स्टेटमेंट में कैसे करें?
इस तरफ:

   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);

और भी कई तरीके इसकी जाँच करते हैं

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

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

13

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

यदि आपकी क्वेरी फॉर्म की है:

SELECT Name from Table where Name = 'Boris'

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

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

SELECT * from Table where Name = 'Boris'

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


9

ऑप्टिमाइज़र न्याय करेगा कि क्या आपके सूचकांक का उपयोग आपकी क्वेरी को तेज़ी से चलाएगा, और यदि यह है, तो यह सूचकांक का उपयोग करेगा।

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

सामान्य तौर पर आपको उन स्तंभों को अनुक्रमित करना चाहिए जिनका आप तालिका में उपयोग करते हैं और जहां कथन हैं


5

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

SELECT * FROM TABLE WHERE attribute = 'value'

उपयुक्त सूचकांक का उपयोग करेगा।


5

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

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

Index hintऐसा लगता है कि MySQL के लिए भी उपलब्ध है । ट्यूडर कॉन्स्टेंटाइन को धन्यवाद।


1

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

हालाँकि, आप ऑप्टिमाइज़र को किसी चीज़ का उपयोग करके स्कैन करने के लिए बाध्य कर सकते हैं

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

या जैसे कुछ का उपयोग करके किसी विशेष सूचकांक की तलाश करना

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

चुनना आपको है। ऑब्जेक्ट पैनल में तालिका के सूचकांक गुणों को देखें कि आप किस सूचकांक का उपयोग करना चाहते हैं। यह आपके फ़िल्टर (नों) से मेल खाना चाहिए।

सर्वोत्तम परिणामों के लिए, उन फ़िल्टरों को सूचीबद्ध करें जो सबसे कम परिणामों को पहले लौटाएंगे। मुझे नहीं पता कि मैं कहने में सही हूं, लेकिन ऐसा लगता है जैसे क्वेरी फ़िल्टर अनुक्रमिक हैं; यदि आपको अपना अनुक्रम सही मिलता है, तो आशावादी को आपके लिए सभी संयोजनों की तुलना करके ऐसा नहीं करना चाहिए, या कम से कम अधिक महंगे प्रश्नों के साथ तुलना शुरू नहीं करनी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.