2008-11-25 24 views
9

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

उत्तर

11

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

संक्षेप में, मुझे नहीं लगता कि यह एक समझदार योजना है, लेकिन सभी अनुकूलन के साथ के रूप में आप अपने विशिष्ट मामले में यह परीक्षण करना चाहिए और फिर तय करते हैं। यदि आप उन्हें पोस्ट करना चाहते हैं तो मुझे आपके परिणाम देखने में दिलचस्पी होगी। और मुझे विश्वास नहीं है कि क्लस्टर सूचकांक का उपयोग करके SQL सर्वर में पंक्ति का पता लगाने का कोई तेज़ तरीका है।

यदि आप परवाह करते हैं, तो Ingres (CA द्वारा) हैश इंडेक्स बना सकते हैं जो तब ओ (1) को प्राप्त करेगा। वहां अन्य आरडीबीएम भी हो सकते हैं जो सच्चे हैश इंडेक्स का भी समर्थन करते हैं।

+0

मैं सहमत नहीं हूं। बाल्टी की संख्या से एमओडी का कुछ हिस्सा एमओडी के बाद सीआरसी काफी यादृच्छिक होना चाहिए। मुझे नहीं लगता कि आपको लगता है कि "अपेक्षाकृत बड़ी संख्या में टकराव" क्यों होंगे। – lkessler

+2

एक परीक्षण के लिए, मैंने अभी 11k स्ट्रिंग्स (ज्यादातर यूआरएल, तो बराबर बराबर प्रारंभिक सेगमेंट) के कॉलम पर टकराव की जांच की है। BINARY_CHECKSUM के साथ मुझे 3 3-तरफा टकराव और 5 2-रास्ता टकराव मिले। हैशबेट्स के साथ मुझे कोई भी नहीं मिला, जैसा कि आप उम्मीद करेंगे, एमडी 2 का उपयोग भी करेंगे। –

0

आईडी मैदान पर एक क्लस्टर सूचकांक से अधिक एक अनुक्रमित अंततः खोज करता है, तो ID फ़ील्ड किसी पूर्णांक के बाद से दोनों संकुल अनुक्रमणिका की तलाश करना होगा है करने के लिए कोई लाभ नहीं है। साथ ही, एक इंट कॉलम का एक चेकम हमेशा कॉलम के समान मूल्य देता है (यानी चेक्सम (535) = 535)। हालांकि, आईडी एक लंबा वर्ण स्तंभ है, तो एक चेक्सम लुकअप आम तौर पर बेहतर प्रदर्शन करेगा।

+0

तो क्लस्टर्ड इंडेक्स से बेहतर प्रदर्शन प्राप्त करने का कोई तरीका है? क्लस्टर्ड इंडेक्स अभी भी ओ (एलजी एन) है और मैं ओ (1) की तलाश में था .. – eulerfx

1

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

जब तक आप सटीक कर रहे हैं संभावित बड़े तार या बाइनरी धब्बे के खिलाफ मेल खाता सामान्य में मैं एक कृत्रिम हैश स्तंभ बनाने नहीं होता है (जैसा कि pipTheGeek का उल्लेख है)। मैं सिर्फ यह जोड़ना चाहता था कि कभी-कभी यह आवश्यक है क्योंकि स्ट्रिंग्स इंडेक्स कुंजी में फ़िट होने के लिए बहुत बड़ी हो सकती हैं। एसक्यूएल सर्वर के लिए 2k लगता है कि इंडेक्स कुंजी के आकार की एक सीमा है।

बेशक

, में अपने शामिल होने आप किसी भी अस्पष्टता है कि हैश से परिणाम को हल करने हैश स्तंभ और स्रोत स्तंभ शामिल करना।

+0

एसक्यूएल सर्वर में सभी इंडेक्स कुंजी कॉलम के अधिकतम कुल आकार के लिए एक [900-बाइट सीमा] (http://stackoverflow.com/a/12717441/880904) है। –

6

मुझे नहीं लगता कि SQL सर्वर के मूल रूप से हैश तालिका आधारित अनुक्रमणिका है। BOL documentation एक गणना (मूल्य पर) एक मानक (पेड़) सूचकांक के निर्माण के बारे में बात कर रहा है। यह Linear Hash Table जैसा ही नहीं है, जो कुछ डीबीएमएस प्लेटफार्मों पर उपलब्ध एक सूचकांक संरचना है, लेकिन SQL सर्वर (AFAIK) नहीं है।

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

+0

अपडेट: इन-मेमोरी एसक्यूएल सर्वर टेबल में हैश टेबल आधारित इंडेक्स क्षमता है। –

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