यदि डेटाबेस में केवल एक ही प्रविष्टि है, तो क्या यह संभव है कि हर संभव कॉलम संयोजन को अनुक्रमित किया जाए?


23

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

सैद्धांतिक रूप से बोल:

  1. अगर हमारे पास बहुत बड़ा डेटाबेस है (150M + पंक्तियाँ कई तालिकाओं पर)
  2. और हम मान सकते हैं कि डेटाबेस केवल एक बार आबाद होगा।

क्या प्रत्येक संभावित कॉलम संयोजन को अनुक्रमणित करने से एक चुनिंदा क्वेरी पर नकारात्मक प्रदर्शन प्रभाव पड़ सकता है?


4
हर संभव संयोजन समय की सबसे अधिक अव्यवहारिक है। एक अधिक समझदार दृष्टिकोण मैन्युअल रूप से अनुक्रमित करना है लेकिन बहुत उदारता से। यह निश्चित रूप से समझ में आ सकता है।
यूएसआर

12
मेरा सुझाव है कि या तो आपके शीर्षक या आपके बोल्ड टेक्स्ट को रिवाइडिंग करें ताकि वे सुसंगत हों। एक नज़र में मुझे सबसे अधिक मत वाले उत्तर "हां" से उलझन में थी
आआआआआ

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

जवाबों:


36

हां, यह प्रारंभिक योजना संकलन समय को प्रभावित करेगा क्योंकि आशावादी के पास विचार करने के लिए डेटा तक कई अतिरिक्त पहुंच मार्ग होंगे।

चूंकि आप SQL सर्वर 2017 पर हैं, एक बार लोड हो रहा है, और रिपोर्ट चला रहे हैं, तो इसके बजाय सिर्फ क्लस्टर कॉलम स्टोर इंडेक्स का उपयोग क्यों नहीं करें?

ऐसा लगता है कि हर संभव कॉलम संयोजन को अनुक्रमित करने की आपकी आवश्यकता का आदर्श समाधान है।

कॉलमस्टोरस्टोर इंडेक्स - ओवरव्यू


Columnstore वह जगह है जहाँ मैं भी जाऊंगा, लेकिन मैं अभी सोच रहा हूँ ... क्या आप जो वर्णन करते हैं, उसके विपरीत काम करने वाला अनुकूलक नहीं है? मेरा मतलब है कि उपलब्ध अनुक्रमितों को स्कैन करने और "आश्चर्य" करने के बजाय उनमें से कौन सा उपयोगी हो सकता है क्या यह क्वेरी की तरह नहीं है और "उस क्वेरी के लिए एक सही सूचकांक" के बारे में सोचें, तो यह जांचता है कि क्या यह मौजूद है? (यदि यह तब नहीं होता है तो एक लापता सूचकांक संदेश उत्पन्न होता है।) यदि मैं सही हूं (मुझे नहीं पता, बस अनुमान लगा रहा है), तो फिर भी अगर अनुक्रमणिका के विवरण हैं तो यह केवल कई होने की तुलना में अधिक समय तक नहीं होना चाहिए। उनमें से।
लिमोनका

26

यदि आपके पास तालिका में एन कॉलम हैं, तो हर संभव कॉलम संयोजन 2 ^ N-1 (खाली सेट को हटाकर) है। 10 कॉलमों का मतलब होगा 1023 इंडेक्स, 20 कॉलमों के लिए हम 1048575 इंडेक्स वाले होते हैं। अधिकांश अनुक्रमणिकाओं का उपयोग कभी नहीं किया जाएगा, लेकिन ऑप्टिमाइज़र द्वारा ध्यान में रखा जाएगा। यह संभव है कि ऑप्टिमाइज़र एक बेहतर के बजाय एक उप-इष्टतम सूचकांक का चयन करेगा। मैं सभी प्रकार के अनुक्रमित उत्पन्न करने का मार्ग नहीं अपनाऊंगा, बजाय यह जानने के कि कौन से सूचकांक वास्तव में लाभकारी होंगे।

EDIT ने संभावित अनुक्रमित संख्या को सही किया

जैसा कि जेफ बताते हैं कि यह 2 ^ N (पावर-सेट) से भी बदतर है (3,2,1) स्पष्ट रूप से (1,2,3) से अलग है। एन कॉलम के लिए हम एक इंडेक्स में पहला स्थान चुन सकते हैं जिसमें एन तरीके के सभी कॉलम होते हैं। एन -1 तरीकों में दूसरी स्थिति के लिए, आदि, इसलिए, हम एन के साथ समाप्त होते हैं! पूर्ण आकार के विभिन्न सूचकांक। इस सेट में किसी भी अन्य इंडेक्स द्वारा किसी भी इंडेक्स को सब्मिट नहीं किया जाता है। इसके अलावा, हम एक और छोटा सूचकांक नहीं जोड़ सकते हैं ताकि यह किसी पूर्ण सूचकांक द्वारा कवर न हो। इंडेक्स की संख्या इसलिए N है! 10 कॉलम के लिए उदाहरण, इसलिए, 10 बन जाता है! = 3628800 सूचकांक और 20 (ड्रमोल) के लिए 2432902008176640000 सूचकांक। यह एक हास्यास्पद बड़ी संख्या है, अगर हम प्रत्येक इंडेक्स को एक मिमी के एक हिस्से के लिए बिंदी लगाते हैं, तो सभी डॉट्स को पारित करने के लिए 94 दिनों का लाइटबाइम लगेगा। सभी और सभी, न; ;-)


6
इससे भी बदतर: सूचकांक में स्तंभों का क्रम महत्वपूर्ण हो सकता है। इसलिए आपको अधिकतम एन मिलता है! अनुक्रमित।
जेफ

2
लेकिन आपको ऐसे इंडेक्स की आवश्यकता नहीं है जो अन्य इंडेक्स के उपसर्ग हैं।
बमर

3
यह और भी बुरा है। हर इंडेक्स के लिए ASC और DESC संयोजन हैं।
ypercube y

2
और इससे भी बदतर, INCLUDE इंडेक्स हैं।
ypercube y

2
और आंशिक सूचकांक की एक बड़ी संख्या।
ypercube y

7

नहीं।

यह "सब कुछ" को अनुक्रमित करने के लिए व्यावहारिक नहीं है, लेकिन आप इसे "सबसे" अनुक्रमित कर सकते हैं।

ये रही चीजें। यदि किसी तालिका में Nकॉलम हैं, तो संभावित अनुक्रमित की संख्या है N!। मान लें कि किसी तालिका में 10 कॉलम हैं, तो आपके पास न केवल 10संभव अनुक्रमित हैं, बल्कि 10!। वह है ... 3,628,800 ... एक ही मेज पर। यह डिस्क स्थान, डिस्क I / O, कैश, और कई बार की तलाश है।

क्यूं कर? कुछ कारण:

  • लाइटवेट इंडेक्स आमतौर पर कैश्ड होते हैं, कुछ ऐसा जो उन्हें तेजी से हल्का बनाता है। यदि आपके पास उनमें से 3 मिलियन हैं, तो वे कैश नहीं होंगे।

  • SQL ऑप्टिमाइज़र को यह तय करने में बहुत समय लग सकता है कि कौन सा उपयोग करना बेहतर है, विशेष रूप से जॉन्स का उपयोग करते समय।

  • एसक्यूएल ऑप्टिमाइज़र व्यापक एल्गोरिथ्म का उपयोग करने पर छोड़ सकता है, और इसके बजाय एक हेयोरिस्टिक एल्गोरिदम का प्रयास कर सकता है। यह "इष्टतम से कम" हो सकता है। उदाहरण के लिए, PostgreSQL में "कम-से -8 टेबल क्वेरी" और "अधिक-से -8 टेबल क्वेरी" के लिए अलग-अलग विकल्प हैं।

  • सूचकांक को ढेर की तुलना में हल्का होना चाहिए। यदि आप सब कुछ अनुक्रमित कर रहे हैं, तो सूचकांक ढेर के रूप में भारी हो जाता है ... कुछ ऐसा जो सूचकांक के उद्देश्य को हरा देता है।


नंबर 2 ^ 10 नहीं है? प्रत्येक कॉलम को दिए गए इंडेक्स से या तो शामिल किया गया है या बाहर रखा गया है। क्या आदेश मायने रखता है?
रेमकोगर्लिच

2
@RemcoGerlich हाँ, आदेश मायने रखता है।
ypercube y

2

नहीं, यह संभवतः SELECTप्रश्नों पर नकारात्मक प्रभाव नहीं डालेगा, लेकिन

  • यह एक उच्च डिस्क उपयोग का कारण होगा।
  • यह लागतों में अत्यधिक वृद्धि करेगा INSERT
  • आपके अधिकांश सूचकांकों का कभी उपयोग नहीं किया जाएगा।
  • कई WHEREहालत अभिव्यक्ति अभी भी सूचकांकों का उपयोग नहीं करेंगे, मुख्य रूप से अधिक जटिल।
  • आवश्यक सूचकांकों की गिनती स्तंभों की गिनती के साथ तेजी से बढ़ेगी। यानी यदि आपके पास, उदाहरण के लिए, 8 कॉलम हैं, तो आपको सभी संभावित संयोजनों के लिए 256 सूचकांकों की आवश्यकता है।

यह पूरी तरह से संकलन समय के लिए समस्या पैदा कर सकता है।
एरिक डार्लिंग

@sp_BlitzErik क्या आप ऐप में ORM के बारे में सोचते हैं?
पीटर कहते हैं मोनिका

नहीं, मेरा जवाब देखिए।
एरिक डार्लिंग

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