क्या बिट कॉलम पर इंडेक्स जोड़ने से आवेषण धीमा हो जाता है?


11

मेरे पास लगभग 1 मिलियन से 5 मिलियन रिकॉर्ड के साथ एक तालिका है। उस रिकॉर्ड के छोटे से हिस्से में 'TRUE' के लिए सेट बिट कॉलम में से एक है। तेजी से उस रिकॉर्ड को खोजने की जरूरत है। मुझे लगता है कि सूचकांक इस स्तंभ पर खोज को गति दे सकता है, लेकिन मुझे INSERT के बारे में डर है। इसलिए मेरा सवाल है।

डेटाबेस डेटा वेयरहाउस की तरह काम कर रहा है, इसलिए कई सेलेक्ट्स और छोटे (प्रति दिन 10-20 तक) हैं, लेकिन काफी बड़े INSERTs (एक बार में 200 हजार रिकॉर्ड तक)। मुझे लगता है कि डेटाबेस के लिए आयात के लंबे समय के बारे में डर लग रहा है।


5
SQL सर्वर का क्या संस्करण? यदि 2008+ एक फ़िल्टर किए गए इंडेक्स की तरह लगता है तो आपको क्या चाहिए।
मार्टिन स्मिथ

SQL सर्वर 2005
marioosh

1
आप तालिका को विभाजित कर सकते हैं (केवल एक स्तंभ के साथ एक नई तालिका जोड़ सकते हैं, तालिका का पीके, जो केवल उन पंक्तियों के साथ आबाद होगा जो बिट स्तंभ सत्य है - अंत में आप बिट कॉलम को भी हटा सकते हैं।) एक अनुक्रमित। आंशिक अनुक्रमणिका की कमी के साथ, 2005 में भी काम करेगा।
ypercube at

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

जवाबों:


8

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

लेकिन मैं अंधेरे में एक अंधा शॉट बनाऊंगा और अनुमान लगाऊंगा कि आपके पास एक कतार पैटर्न क्या है: रिकॉर्ड तालिका में 'TRUE' के बिट सेट के साथ गिराए जाते हैं (यानी। 'needsprocessing = true') और फिर एक पृष्ठभूमि प्रक्रिया दिखती है इन रिकॉर्ड्स के लिए, कुछ प्रोसेसिंग करता है, और FALSE को थोड़ा अपडेट करता है। यह एक सर्वव्यापी पैटर्न है, जिसे प्यार से 'प्रदर्शन आपदा नुस्खा पैटर्न' के रूप में भी जाना जाता है। मैं मेज पर में रिकॉर्ड छोड़ने और एक छोड़ने की सिफारिश करेंगे अधिसूचना (नव डाला रिकॉर्ड आईडी के रूप में सरल रूप में हो सकता है), एक ही समय में, एक में कतारक्यू के रूप में टेबल्स का उपयोग करना देखें ।


1
मैं सबसे बाईं ओर बिट कॉलम डालने में कोई अच्छा बिंदु नहीं देख रहा हूं क्योंकि हमें पता नहीं है कि उच्च कार्डिनैलिटी उपयोगकर्ता के साथ अन्य फ़िल्टर कॉलम हो सकते हैं। अब तक मैंने देखा है बीआईटी कॉलम क्लस्टर इंडेक्स में आखिरी पसंद है। लेकिन हाँ, +1 को "क्यू के रूप में तालिका का उपयोग करना" के अच्छे संदर्भ के लिए।
अनूप शाह

2
वास्तव में मैंने एक परीक्षण चलाया और हाँ यह सूचकांक का उपयोग करेगा। एक तालिका बनाएं (आईडी पहचान, माइबिट बिट) 100 पंक्तियों को जोड़ें जहां बिट 0 और 2000000 है जहां बिट 1 है। सुनिश्चित करें कि आंकड़े अपडेट किए गए हैं (यदि आवश्यक हो) और myBit = 0 पर एक क्वेरी चलाएँ और सूचकांक का उपयोग किया जाएगा।
केनेथ फिशर

@KennethFisher सिवाय इसके कि उच्च उच्च वेग पैटर्न में TRUE / अपडेट FALSE करने के लिए तुरंत आँकड़े हमेशा पुराने हो जाएंगे। यदि आप एक स्पष्ट डिजाइन करने के बजाय ऑप्टिमाइज़र के साथ रूसी रूले खेलना पसंद करते हैं, तो आपको वह मिलेगा जो आप योग्य हैं ...
रेमस रुसानु

"यह कभी भी इसका उपयोग नहीं करेगा" यह कथन 99% मामलों के लिए है, लेकिन हम नहीं जानते कि ओपी किस मामले में है। मैंने सफलतापूर्वक बिट पर अनुक्रमित किया है। उपयोग के मामले मौजूद हैं।
usr

सवाल - जवाब है यहां , गलत विशेष रूप से> "जब आप सूचकांक थोड़ा क्षेत्र (या कुछ संकीर्ण रेंज), आप केवल उस मान से मेल खाने पंक्तियों की संख्या से काम कर सेट को कम। यदि आपके पास यह मिलान पंक्तियों की एक छोटी संख्या आपके कामकाजी सेट को बहुत कम कर देगा । 50/50 वितरण वाली बड़ी संख्या में पंक्तियों के लिए, यह आपको बहुत कम प्रदर्शन हासिल कर सकता है। किस मामले में, थोड़ा सा ऐसा इंडेक्स जो रिकॉर्ड के 1% से मेल खाता है, एक महत्वपूर्ण बढ़ावा के लिए 1 मिलियन का 99% स्कैन करने की आवश्यकता को कम करेगा?
drzaus

2

जैसा कि @MartinSmith ने कहा कि अगर आप कभी SQL 2008 में अपग्रेड करते हैं तो एक फ़िल्टर किया गया इंडेक्स सही समाधान होगा। हालांकि सामान्य समय के दौरान किसी भी जोड़े गए इंडेक्स से आपके लोड समय में वृद्धि होगी। छोटे सूचकांक बड़े लोगों की तुलना में कम होते हैं।

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

अगली बात यह है कि "क्या मेरे पास पहले से ही बहुत सारे सूचकांक हैं?" कोई कठिन और तेज़ नियम नहीं है जैसा कि "बहुत कुछ" है, लेकिन मैं आमतौर पर 10 इंडेक्स के नियम से जाता हूं, यह सीमा है जब तक मुझे वास्तव में एक नए की आवश्यकता नहीं होती है।

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

केवल आप वास्तव में तय कर सकते हैं कि "महत्वपूर्ण" क्या है। मेरे पास मशीनें हैं जहां लोड समय में 5 मिनट जोड़ना "महत्वपूर्ण" है और अन्य जहां मैं सुरक्षित रूप से कुछ घंटे की वृद्धि देख सकता हूं।

संपादित करें:

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

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