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


99

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

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

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


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

4
हालांकि मुझे नहीं लगता कि मैं केवल एक बिट कॉलम को इंडेक्स करूंगा, लेकिन एक यौगिक इंडेक्स के हिस्से के रूप में बिट कॉलम को शामिल करना बहुत आम है। एक सरल उदाहरण केवल अंतिम नाम के बजाय ACTIVE, LASTNAME पर एक सूचकांक होगा, जब आपका आवेदन लगभग हमेशा सक्रिय ग्राहकों की तलाश में होता है।
ब्रैड ऑक्ट

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

5
मैं असहमत होता। यदि आपका वितरण 50/50 है, तो आप कभी भी सूचकांक का उपयोग नहीं करेंगे, क्योंकि यह केवल टेबल स्कैन करने के लिए तेज होगा। हालाँकि, यदि आपके पास केवल 5, 1 मान और 1 मिलियन 0 मान हैं, तो 1. खोजते समय इंडेक्स का उपयोग करने की बहुत संभावना होगी।
Kibbee

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

जवाबों:


72

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

जब आप पंक्तियों का एक सेट मांगते हैं, तो SQL तालिका स्कैनिंग (प्रत्येक पंक्ति को देखते हुए) से पंक्तियों को अधिक तेज़ी से खोजने के लिए अनुक्रमणिका का उपयोग करता है।

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

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

तो एसक्यूएल वास्तव में क्या कर रहा है काम कर रहे सेट (पंक्तियों की संख्या) को कम करने की कोशिश कर रहा है।

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

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


तो ऐसा लगता है कि अगर मेरे पास केवल कुछ पंक्तियाँ हैं जहाँ बिट फ़ील्ड 1 है (उदाहरण के लिए "IsProcessed" का ट्रैक रखते हुए), तो एक इंडेक्स अच्छा होगा क्योंकि यह उन्हें मूल्य द्वारा आदेश देगा और फिर चयन करने में सक्षम होगा छोटे काम बहुत जल्दी सेट। यदि आप सहमत हैं, तो उसे जोड़ें और मैं इसे स्वीकार करूंगा।
at को जेरेमेक

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

1
किया हुआ। मैं सोच रहा था कि एक लाख पंक्तियों के लिए, एक बिट क्षेत्र में 50% वितरण होगा, लेकिन आप सही हैं कि किसी विशेष समस्या के लिए यह काम करने वाले सेट को बहुत कम कर सकता है।
ज्योफ कॉक्स

इंडेक्स के साथ और इसके बिना निष्पादन योजनाओं को देखना सार्थक है, और देखें कि क्या इंडेक्स का उपयोग किया जा रहा है और यदि यह वास्तव में आपके प्रश्नों की लागत को कम करता है। आसान और वैज्ञानिक!
onupdatecascade 17

बिट फ़ील्ड + किसी अन्य फ़ील्ड को अनुक्रमित करने के बारे में क्या? उदाहरण के लिए। एक वेब गतिविधि लॉग में, एक टाइमस्टैम्प को अनुक्रमित करेगा, लेकिन एक अन्य उपयोगी सूचकांक बिट क्षेत्र "IsHTTPS" + टाइमस्टैम्प पर हो सकता है, जल्दी से सभी https कार्यों को देखने के लिए। क्या यह भी अक्षम होगा?
ingredient_15939

19

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

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

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


1
यह ध्यान देने योग्य है कि क्वेरी में विधेय को फ़िल्टर किए गए इंडेक्स में मूल्य के लिए हार्ड-कोड किया जाना चाहिए। यदि आप किसी पैरामीटर में मान पास करते हैं yourBitColumn = @value, तो ऑप्टिमाइज़र यह निर्धारित नहीं कर सकता है कि फ़िल्टर किया गया इंडेक्स प्रयोग करने योग्य है या नहीं।
जिओफ़्फ़्फ़्न्ट्ज़

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

9

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

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


8

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


2
यदि 99% पंक्तियाँ बिट = 1 हैं, तो ऑप्टिमाइज़र को सूचकांक को अनदेखा करना चाहिए और टेबल स्कैन करना चाहिए। इंडेक्स का उपयोग वास्तव में टेबल स्कैन से भी बदतर होगा , कम से कम एक घूर्णी ड्राइव पर, अधिक I / O और डिस्क से गैर-लगातार रीडिंग। फ़िल्टर्ड इंडेक्स (पोस्टग्रेज़ समकक्ष: आंशिक इंडेक्स) जाने का रास्ता है। मुझे लगता है क्योंकि यह प्रश्न के वर्षों बाद है, इस जवाब को वोट नहीं मिला जो इसके हकदार थे।
एंड्रयू लाजर

7

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

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


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

7

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

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/

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

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

वेकबैक मशीन: http://web.archive.org/web/20150508115802/http://www.toadworld.com/platforms/sql-server/b/weblog/archive/2014/02/17/dba-myths-an -index-ऑन-एक-बिट-स्तंभ-होगा-कभी हो-used.aspx


यह लेख अब दिखाई नहीं देता
होमर 6

@ होमर 6 मैंने इस लेख के लिए नए घर की तरह दिखने के लिए एक लिंक जोड़ा।
जेफ

नया लिंक Toad World होमपेज पर जाता है।
N West

वेबैक मशीन का उपयोग करके लेख मिला, और एक नया संबंधित लेख मिला। उम्मीद है की यह मदद करेगा।
जेफ

2

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

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


2

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

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

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


यह संपूर्ण रूप में स्तंभ की इतनी अधिकता नहीं है जो मायने रखता है। यह WHERE क्लॉज की चयनात्मकता है। इसलिए यदि मान 1 के साथ कुछ कॉलम हैं, तो यह अभी भी सूचकांक में अच्छा हो सकता है। यदि यह 50/50 (जैसे पुरुष / महिला) है तो इसके लायक नहीं है।
डब्ल्यूडब्ल्यू।

2

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

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


2

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

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

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


2

यदि आप जानना चाहते हैं कि क्या किसी सूचकांक में आपकी इच्छा के प्रभाव हैं: परीक्षण और फिर से परीक्षण करें।

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


1

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


1

आप SQL Server 2000 में एक छोटे से क्षेत्र को अनुक्रमणित नहीं कर सकते , जैसा कि उस समय ऑनलाइन पुस्तकों में दिखाया गया था:

बिट

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

टिप्पणियों

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

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

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

CREATE INDEX IX_Users_IsActiveUsername ON Users
(
   IsActive,
   Username
)

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

SELECT TOP 1 Username 
FROM Users
WHERE IsActive = 0

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

SELECT TOP 1 * 
FROM Users
WHERE IsActive = 0

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


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

SELECT TOP 1 Username 
FROM Users
WHERE IsActive = 0

कवर सूचकांक के माध्यम से एक सूचकांक की तलाश का कारण होगा। लेकिन गैर-कवर मामला:

SELECT TOP 1 * 
FROM Users
WHERE IsActive = 0

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

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


FYI करें - SQL सर्वर 2005 प्रबंधन स्टूडियो आपको ऐसा करने देता है।

SQL Server 2000 की मेरी प्रतिलिपि मुझे एक बिट कॉलम पर एक इंडेक्स सेट करने देती है।
किब्बी

SQL Server 2000 की मेरी प्रतिलिपि मुझे एक बिट कॉलम पर एक इंडेक्स सेट करने की अनुमति नहीं देती है।
इयान बॉयड

1

बहुत देर से जवाब ...

हाँ, यह SQL CAT टीम के अनुसार उपयोगी हो सकता है (अद्यतन किया गया है, समेकित किया गया है)


1
लिंक अब मृत प्रतीत होता है। हालाँकि, उस पोस्ट को ई-बुक में कई अन्य लोगों के साथ समेकित किया गया प्रतीत होता है । संदर्भित अनुभाग पृष्ठ 86 पर शुरू होता है। ई-बुक को SQLCAT.com ई- बुक्स से "SQLCAT की गाइड टू रिलेशनल इंजन" लिंक के तहत डाउनलोड किया जा सकता है ।
mwolfe02

0

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


0

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

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


1
मैं असहमत होता। यदि आपका वितरण 50/50 है, तो आप कभी भी सूचकांक का उपयोग नहीं करेंगे, क्योंकि यह केवल टेबल स्कैन करने के लिए तेज होगा। हालाँकि, यदि आपके पास केवल 5, 1 मान और 1 मिलियन 0 मान हैं, तो 1. खोजते समय इंडेक्स का उपयोग करने की बहुत संभावना होगी।
Kibbee

0

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


0

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


0

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

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