दिलचस्प पोस्ट
MongoDB में निकाले गए दस्तावेज कैसे प्राप्त करें? वेब एप से मोबाइल के कैमरे तक कैसे पहुंचें? सरणी की कुंजी को पुनरावर्ती रूप से प्राप्त करें और अंडरस्कोर से अलग स्ट्रिंग बनाएं मैं अपने ब्राउज़र में ज्यूपिटर / आईप्याथॉन नोटबुक की सेल की चौड़ाई कैसे बढ़ाऊं? संबंधित आवृत्तियों / अनुपात के साथ dplyr एंड्रॉइड टैब या पृष्ठभूमि परिवर्तन कैसे अनुकूलित करें? एक नए टैब में यूआरएल खोलना आईफोन कुंजीपटल भाषा सेट करना एक्लिप्से में पर्यावरण चर preg_match का उपयोग करके यूट्यूब वीडियो आईडी पार्स करें मैं एक टैबकंट्रोल को बाइंड करने के लिए ViewModels का संग्रह कैसे कर सकता हूं? ग्रिडपैन JavaFX में सीमाएं जोड़ना DropDownList asp.net MVC में चयनित आइटम की सेटिंग ओएस एक्स फ्रेमवर्क लाइब्रेरी लोड नहीं हुई: 'इमेज नहीं मिली' फ़ंक्शन के भीतर ggplot2 को वर्ण स्ट्रिंग पास करें

क्या मुझे SQL सर्वर में थोड़ी फ़ील्ड को अनुक्रमणिका चाहिए?

मुझे याद है कि एक बिंदु पर पढ़ना एक कम क्षेत्र में एक क्षेत्र को अनुक्रमणित करना (अलग-अलग मानों की कम संख्या) वास्तव में करने योग्य नहीं है मैं मानता हूं कि मुझे इस बारे में पर्याप्त जानकारी नहीं है कि अनुक्रमित कैसे समझते हैं कि यह क्यों है।

तो क्या अगर मेरे पास इसमें 100 मिलियन पंक्तियों के साथ एक टेबल है, और मैं रिकॉर्ड का चयन कर रहा हूँ जहां थोड़ा क्षेत्र 1 है? और हम कहते हैं कि समय के किसी भी समय, केवल कुछ मुट्ठी भर रिकॉर्ड होते हैं जहां बिट फ़ील्ड 1 (जैसा कि 0 का विरोध है)। क्या यह बिट फ़ील्ड इंडेक्स लायक है या नहीं? क्यूं कर?

बेशक मैं सिर्फ इसका परीक्षण कर सकता हूं और निष्पादन योजना की जांच कर सकता हूं, और मैं ऐसा करूँगा, लेकिन मैं इसके पीछे के सिद्धांत के बारे में भी उत्सुक हूं। जब प्रधानता का मामला होता है और यह कब नहीं करता?

Solutions Collecting From Web of "क्या मुझे SQL सर्वर में थोड़ी फ़ील्ड को अनुक्रमणिका चाहिए?"

मान लें कि एसक्यूएल में एक सूचकांक क्या है- और सूचकांक मेमोरी के अन्य खंडों (यानी पंक्तियों के लिए संकेत) पर इंगित स्मृति का हिस्सा है। सूचकांक पृष्ठों में तोड़ा गया है ताकि उपयोग के आधार पर सूचकांक का भाग लोड किया जा सके और स्मृति से उतार दिया जा सके।

जब आप पंक्तियों का एक सेट पूछते हैं, तो SQL तालिका की स्कैनिंग (हर पंक्ति को देखते हुए) की तुलना में पंक्तियों को खोजने के लिए इंडेक्स का उपयोग करता है

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

जब आप एक पूर्णांक स्तंभ को सूचक करते हैं, तो एसक्यूएल के सूचकांक में प्रत्येक सूचकांक मान के लिए पंक्तियों का एक सेट होता है। यदि आपके पास 1 से 10 की रेंज है, तो आपके पास 10 इंडेक्स पॉइंटर्स होंगे। इस पर निर्भर करता है कि कितनी पंक्तियाँ अलग-अलग पेज किए जा सकती हैं यदि आपकी क्वेरी "1" से मेल खाने वाली इंडेक्स को दिखती है और जहां नाम में "फ्रेड" (नाम का स्तंभ माना जाता है) अनुक्रमित नहीं होता है, तो एसक्यूएल "1" से मेल खाने वाली पंक्तियों का सेट बहुत तेज हो जाता है, फिर तालिका स्कैन करता है बाकी को खोजने के लिए।

तो वास्तव में जो एसक्यूएल कर रहा है वह काम करने की संख्या को कम करने की कोशिश कर रहा है (पंक्तियों की संख्या) इसे फिर से चलाना पड़ता है

जब आप थोड़ी फ़ील्ड (या कुछ संकीर्ण सीमा) को इंडेक्स करते हैं, तो आप उस मूल्य से मेल खाने वाली पंक्तियों की संख्या से केवल कार्य सेट को कम करते हैं। यदि आपके पास से छोटी पंक्तियाँ मिलती हैं तो यह आपके काम को बहुत कम कर देगा। 50/50 वितरण के साथ बड़ी संख्या में पंक्तियों के लिए, यह आपके लिए बहुत कम प्रदर्शन लाभ बना सकता है।

प्रत्येक व्यक्ति का परीक्षण करने का कारण यह है कि एसक्यूएल में एक बहुत ही चतुर और जटिल अनुकूलक होता है जो एक सूचक को अनदेखा कर सकता है यदि यह तय करता है कि तालिका स्कैनिंग तेज है, या किसी प्रकार का उपयोग कर सकता है, या स्मृति पृष्ठों को व्यवस्थित कर सकता है लेकिन यह अच्छी तरह से पसंद करता है

मैं सिर्फ इस सवाल पर दूसरे के माध्यम से आया था। यह मानते हुए कि आपका बयान केवल एक मुट्ठी भर रिकॉर्ड 1 के मान मानता है (और यह वह है जो आपकी रुचि रखते हैं), फिर एक फ़िल्टर किए गए सूचकांक एक अच्छा विकल्प हो सकता है कुछ इस तरह:

create index [IX_foobar] on dbo.Foobar (FooID) where yourBitColumn = 1 

यह पर्याप्त रूप से छोटा सूचकांक बना देगा जो अनुकूलक बहुत चालाक है जब वह आपकी क्वेरी में एक बिंदू है

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

फिर, मैं निश्चित रूप से डेटाबेस विशेषज्ञ नहीं हूं और कुछ महत्वपूर्ण बातों को याद कर सकता हूं।

हालांकि मुझे नहीं लगता कि मैं अपने आप में केवल एक बिट कॉलम को सूचकित करता हूं, यौगिक सूचकांक के हिस्से के रूप में बिट कॉलम को शामिल करना बहुत आम है

एक साधारण उदाहरण, केवल अंतिम नाम के बजाय ACTIVE, LASTNAME पर एक अनुक्रमणिका होगा, जब आपका ऐप्लिकेशन लगभग हमेशा सक्रिय ग्राहकों की तलाश में होता है

अगर आपने इसे नहीं पढ़ा है, तो जेसन मासी ने हाल ही में एक लेख लिखा था जिस पर इस विषय पर चर्चा की गई।

http://statisticsio.com/Home/tabid/36/articleType/ArticleView/articleId/302/Never-Index-a-BIT.aspx

संपादित करें: नया लेख स्थान – http://sqlserverpedia.com/blog/sql-server-bloggers/never-index-a-bit

पहले "नया" आलेख के लिए वेकबैक मशीन: http://web.archive.org/web/20120201122503/http://sqlserverpedia.com/blog/sql-server-bloggers/never-index-a-bit/

नया एसक्यूएल सर्वर पीडिया स्थान टॉडवर्ल्ड है, जिसमें केनेथ फिशर का एक नया लेख इस विषय पर चर्चा कर रहा है:

http://www.toadworld.com/platforms/sql-server/b/weblog/archive/2014/02/17/dba-myths-an-index-on-a-bit-column-will-never-be- used.aspx

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

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

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

आपकी सबसे अच्छी कार्रवाई करने के लिए एक बुनियादी चयन * से तालिका WHERE BitField = 1 के साथ परीक्षण करना होगा; क्वेरी और धीरे-धीरे वहां से कार्यप्रणाली का निर्माण करते हैं, जब तक कि आपके आवेदन के लिए एक यथार्थवादी क्वेरी न हो, तब तक यह सुनिश्चित करने के लिए हर कदम के साथ निष्पादन योजना का परीक्षण किया जा रहा है कि सूचकांक अभी भी उपयोग किया जा रहा है। बेशक, इसमें कोई गारंटी नहीं है कि इस निष्पादन योजना का उत्पादन प्रयोग में किया जाएगा, लेकिन यह एक अच्छा मौका है कि यह होगा।

कुछ जानकारी sql-server-performance.com मंचों पर और संदर्भित आलेख में पाई जा सकती हैं

"मुझे याद है कि एक बिंदु पर पढ़ना है कि कम कार्डिनलिटी (अलग-अलग मानों की कम संख्या) वाले क्षेत्र को सूचीबद्ध करना वास्तव में अच्छा नहीं है"

क्योंकि एसक्यूएल सर्वर को सूचकांक को पढ़ने के बजाय सिर्फ एक टेबल-स्कैन करना अधिक कुशल होगा। तो मूल रूप से आपके सूचकांक का उपयोग कभी नहीं किया जाएगा और इसे बनाए रखने के लिए यह एक बेकार है। जैसा कि दूसरों ने कहा है कि यह एक मिश्रित सूचकांक में ठीक हो सकता है

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

http://www.microsoft.com/technet/prodtechnol/sql/2005/impprfiv.mspx

यह सब मानता है कि आप माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005 एंटरप्राइज हैं। वही 2008 में लागू हो सकता है, मैं उस संस्करण से परिचित नहीं हूं

यदि आपके वितरण को काफी जाना जाता है और असंतुलित होता है, तो 99% पंक्तियों की तरह बिट = 1 होती है और 1% बिट = 0 होती है, जब आप बिट = 1 के साथ एक WHERE क्लॉज करते हैं, तो एक पूर्ण तालिका स्कैन उसी समय के आसपास होगी सूचकांक स्कैन यदि आप एक तेज प्रश्न पूछना चाहते हैं जहां बिट = 0, मुझे पता है कि सबसे अच्छा तरीका एक फ़िल्टर किए गए सूचकांक बना रहा है, जिसमें कोई क्लॉज WHERE bit = 0 जोड़ता है। इसी तरह, यह अनुक्रमणिका केवल 1% पंक्ति को संग्रहीत करेगा फिर एक WHERE बिट = 0 करना बस उस क्वेरी को ऑप्टिमाइज़ करने वाले क्वेरी ऑप्टीमाइजर को देता है, और उसमें से सभी पंक्तियां बिट = 0 होगी। आपके पास बहुत कम मात्रा में डिस्क स्पेस की ज़रूरत होती है, इसके लिए बिट पर पूर्ण इंडेक्स की तुलना की आवश्यकता होती है ।

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

यदि आप जानना चाहते हैं कि क्या एक इंडेक्स के प्रभावों को आप चाहते हैं: टेस्ट और टेस्ट दोबारा।

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

आप SQL Server 2000 में थोड़ी फ़ील्ड को इंडेक्स नहीं कर सकते , जैसा कि उस समय पुस्तकें ऑनलाइन में इंगित किया गया था:

बिट

पूर्णांक डेटा प्रकार 1, 0 या शून्य।

टिप्पणियों

टाइप बिट के कॉलम उन पर अनुक्रमित नहीं हो सकते।

हां, यदि आपके पास केवल मुट्ठी भर पंक्तियाँ हैं, तो लाखों में से, एक सूचकांक मदद करेगा। लेकिन अगर आप इसे इस मामले में करना चाहते हैं, तो आपको कॉलम को एक छोटा रंग बनाने की आवश्यकता है।

नोट : एंटरप्राइज़ प्रबंधक आपको थोड़ी कॉलम पर एक इंडेक्स बनाने नहीं देगा। यदि आप चाहें तो आप मैन्युअल रूप से एक बिट कॉलम पर एक इंडेक्स बना सकते हैं:

 CREATE INDEX IX_Users_IsActiveUsername ON Users ( IsActive, Username ) 

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

 SELECT TOP 1 Username FROM Users WHERE IsActive = 0 

एसक्यूएल सर्वर 2000 के बजाय एक टेबल स्कैन करेंगे, जैसे कि इंडेक्स भी मौजूद नहीं है। अगर आप कॉलम को एक टिनिंट SQL सर्वर 2000 में बदलते हैं तो इंडेक्स की तलाश करना होगा । साथ ही, निम्नलिखित गैर-कवर की गई क्वेरी:

 SELECT TOP 1 * FROM Users WHERE IsActive = 0 

यह एक इंडेक्स की तलाश करेगी, इसके बाद एक बुकमार्क लुकअप होगा।


एसक्यूएल सर्वर 2005 बिट कॉलम पर अनुक्रमित के लिए सीमित समर्थन है। उदाहरण के लिए:

 SELECT TOP 1 Username FROM Users WHERE IsActive = 0 

एक इंडेक्स को आच्छादन सूचकांक के माध्यम से लेना होगा। लेकिन गैर-कवर किया गया मामला:

 SELECT TOP 1 * FROM Users WHERE IsActive = 0 

किसी बुकमार्क लुकअप के बाद किसी इंडेक्स की तलाश नहीं करेगा, यह एक बेंचमार्क लुकअप के बाद सूचकांक की तलाश को करने के बजाय, एक टेबल स्कैन (या संकुल सूचकांक स्कैन) प्रदर्शन करेगा।

प्रयोग और प्रत्यक्ष अवलोकन द्वारा सत्यापित किया गया

बहुत देर से उत्तर …

हां, यह एसक्यूएल कैट टीम के अनुसार उपयोगी हो सकता है (अद्यतित, समेकित किया गया है)

क्या यह एक सामान्य प्रश्न है? रिकॉर्ड की "मुट्ठी" की तलाश करते समय यह इसके लायक हो सकता है लेकिन अन्य पंक्तियों पर आपको अधिक मदद नहीं करेगा। क्या डेटा की पहचान करने के अन्य तरीके हैं?

कार्डिनालिटी एक कारक है, अन्य यह है कि इंडेक्स आपके डेटा को कितनी अच्छी तरह विभाजित करता है। यदि आपके पास आधा 1/2 और आधे 0 के बीच है, तो यह मदद करेगा (यह मानते हुए कि सूचकांक किसी अन्य सूचकांक की तुलना में बेहतर रास्ता है)। हालांकि, आप कितनी बार डालने और अद्यतन कर रहे हैं? चयन प्रदर्शन के लिए अनुक्रमित जोड़ना भी INSERT, अद्यतन और प्रदर्शन को हटा दें, इसलिए इसे ध्यान में रखें।

मैं कहूंगा, अगर 1 से 0 से (या इसके विपरीत) 75% से 25% से बेहतर नहीं है, तो चिंता न करें।

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

इयान बॉयड सही है जब वह कहता है कि आप इसे एसक्यूएल 2000 के लिए एंटरप्राइज़ मैनेजर के माध्यम से नहीं कर सकते (इसे टेट टी-एसक्यूएल बनाने के बारे में उनकी नोट देखें)

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