2010-02-09 9 views
6

कहो मैं एक मेज मिल गया है:क्या SQL सर्वर एक कंपाउंड इंडेक्स का उपयोग करेगा जब WHERE क्लॉज में केवल एक ही कॉलम है?

CREATE TABLE Users (
    Id INT IDENTITY (1, 1), 
    FirstName VARCHAR(40), 
    LastName VARCHAR(40) 
) 

प्रश्नों प्रथम या पर आम तौर पर कर रहे हैं अंतिम नाम, लेकिन यह भी पर प्रथमऔरअंतिम नाम

अगर मैं अंतिम नाम पर प्रथम और एक अन्य पर एक गैर क्लस्टर सूचकांक बनाने के लिए, तो मेरे पहले दो प्रश्नों के लिए catered रहे हैं। जाहिर है, SQL सर्वर अन्य क्वेरी के लिए index intersection का उपयोग करेगा।

वैकल्पिक रूप से, अगर मैं (प्रथम) पर और (अंतिम नाम, प्रथम नाम) पर indexees है,/एसक्यूएल सर्वर क्वेरी के लिए दूसरा सूचकांक सिर्फ अंतिम नाम साथ ही दोनों पर प्रश्नों पर इस्तेमाल कर रहा है कर सकते हैं?

क्या एसक्यूएल सर्वर स्टोर कंपाउंड इंडेक्स पार्ट्स बाएं से दाएं या दाएं से बाएं हैं? दूसरे शब्दों में: क्या यह LastNameFirstName या FirstNameLastName के रूप में कुंजी बनाएगा? या यह एक मनमाने ढंग से चुनने के लिए स्वतंत्र है?

उत्तर

5

SQL सर्वर केवल अंतिम नाम पर क्वेरी के लिए इंडेक्स (LastName, FirstName) का उपयोग कर सकता है और दोनों पर प्रश्न पूछ सकता है?

हां, डेटाबेस LastName पर क्वेरी के लिए इंडेक्स (LastName, FirstName) का उपयोग करेगा। यह नहीं हालांकि इस सूचकांक का उपयोग केवल प्रथम नाम पर प्रश्नों के लिए करें।

क्या यह कंपाउंड इंडेक्स भागों को बाएं से दाएं या दाएं से बाएं स्टोर करता है?

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

+0

मेरा मतलब है: बी-ट्री में डालने की कुंजी बनाते समय, ए (बी, सी) या (सी, बी, ए) के रूप में संग्रहीत एक कंपाउंड इंडेक्स (ए, बी, सी) की कुंजी है, या यह एक मनमाने ढंग से लेने के लिए एसक्यूएल सर्वर पर है? –

+2

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

1

हां, यदि आप अकेले लास्टनाम पर पूछते हैं तो इसे (LastName, FirstName) अनुक्रमणिका का उपयोग करना चाहिए। तो यह अकेले LastName द्वारा पूछताछ, या LastName और FirstName दोनों के साथ पूछताछ दोनों का उपयोग किया जाएगा।

सामान्य दिशानिर्देश यह सुनिश्चित करना है कि सबसे बड़ी चुनिंदाता वाला कॉलम पहले यौगिक सूचकांक में दिखाई देता है क्योंकि इससे परिणामस्वरूप कम से कम चुनिंदा कॉलम कम से कम परिणाम प्राप्त होते हैं।

1

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

इसके अलावा, जैसा कि अभी तक इसका उल्लेख नहीं किया गया है और प्रदान किया गया है कि आप कम से कम SQL Server 2005 पर हैं: मुझे गैर-क्लस्टर इंडेक्स के लिए INCLUDE खंड में फेंक दें। यह किसी अनदेखी, लेकिन किसी भी अनुक्रमण रणनीति के लिए वास्तव में उपयोगी अतिरिक्त है।

+0

+1; भी शामिल है। –

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