indexing - H2 database: slow query although index is used -


एच 2 1.3.176 का उपयोग करना

1) तालिका परिभाषा:

  टेबल टेस्ट बनाएं (आईडी बिगिन प्राथमिक कुंजी, खाता बिगिन, टेक्साइड बिगिन);  

2) तालिका में मान डालने:

  परीक्षण का चयन एक्स, रैंड () * 100, एक्स से SYSTEM_RANGE (1, 1000000) INSERT < / कोड>  

3) मेरी क्वेरी के लिए उपयोग करने के लिए एक इंडेक्स बना रहा है:

  `` परीक्षा` (अकाउंट, टीएक्सआईडी डीईएससी) पर अनन्य इंडेक्स आईडीएक्सटीएक्सएएसीएसीएटीसीएक्सआईडी बनाएं;  

4) निम्नलिखित क्वेरी कर रहा है:

  परीक्षण से टेक्सड का चयन करें विश्लेषण करें जहां खाता = 22 और txid & lt; 999999 9 आदेश txid desc limit 25   

मुझे निम्नलिखित निष्पादन योजना मिलती है:

  सार्वजनिक से चुनें TXID / * PUBLIC.IDX_TEST_ACCOUNT_TXID: ACCOUNT = 22 और TXID & lt; 9999999 * / / * स्कैनकाउंट: 9867 * / WHERE (खाता = 22) और (TXID & lt; 99 99 99 9) आदेश द्वारा 1 डीईएससी सीमा 25 / * परीक्षा .IDX_TEST_ACCOUNT_TXID पठन: 103 * /  

प्रश्न: एच 2 को पूरे सूचकांक के माध्यम से स्कैन करने की आवश्यकता क्यों है? मैं स्कैन गणना को 25 होने की उम्मीद कर रहा था क्योंकि सूचकांक में टीसीडीड पहले से ही अवरोही क्रम में होना चाहिए, एक बार एच 2 खाते में खाता है = इंडेक्स की 22 शाखा, यह सिर्फ अगले 25 प्रविष्टियों को पढ़ने में सक्षम होना चाहिए। इससे प्रश्नों को धीमा कर दिया जाएगा यदि तालिका में लाखों प्रविष्टियां हैं। यहां तक ​​कि अगर H2 को सूचकांक के भीतर पहली मिलान प्रविष्टि के लिए खोज करनी है, तो मुझे उम्मीद है कि यह एक ओ (लॉग (एन)) एल्गोरिथम होगा और एक स्कैन नहीं होगा। अगर मैं कॉलम अकाउंट के बिना एक ही चीज़ करता हूं (तालिका में सिर्फ आईडी और टीएक्सआईडी है) तो टीडीआईडी ​​पर एक अवरोही सूचक को वास्तव में 25 की स्कैन गणना होगी (क्वेरी का उपयोग करके "टेक्सड का चयन करें जहां टेक्सिड और एलटी; 99 99 99 9 ऑर्डर द्वारा txid desc ") अतिरिक्त कॉलम निष्पादन योजना को बर्बाद क्यों कर रहा है? शायद मुझे समझ में नहीं आता कि सूचकांक कैसे काम करता है। क्या मेरी क्वेरी के लिए सूचक को परिभाषित करने का एक बेहतर तरीका है?

मैंने h2 स्रोत कोड के माध्यम से कदम रखा और पता चला कि क्या गलत हो रहा है:

क्वेरी के निष्पादन को तैयार करने के दौरान, H2 यह निर्धारित करने की कोशिश करता है कि क्या वह परिणाम सेट को सॉर्ट करने और सीमित करने के लिए सूचकांक का उपयोग कर सकता है। चूंकि पहला सूचकांक स्तंभ (खाता) खंड के क्रम में नहीं है, इसलिए एच 2 सोचता है कि यह सूचकांक का उपयोग नहीं कर सकता है। इसके परिणामस्वरूप एच 2 स्कैनिंग में सभी पंक्तियों को प्राप्त करने के लिए पूरे सूचकांक के माध्यम से स्कैनिंग किया जाता है और फिर परिणाम सेट को छंटनी और सीमित किया जाता है। यह आश्चर्यजनक है क्योंकि खाते की स्थिति "बराबर" स्थिति है इसलिए एच 2 को समझना चाहिए कि यह वास्तव में परिणाम सेट को सॉर्ट करने और सीमित करने के लिए सूचकांक का उपयोग कर सकता है। समाधान खंड द्वारा आदेश में खाता कॉलम प्रदान करना है। इस प्रकार पूछताछ होनी चाहिए:

  परीक्षण से टेक्सड चुनें जहां खाते = 22 और txid & lt; 9999999 खाते के अनुसार, txid desc limit 25  

और मुझे मिल अपेक्षित निष्पादन योजना

  सार्वजनिक से चुनें TXID / * PUBLIC.IDX_TEST_ACCOUNT_TXID: ACCOUNT = 22 और TXID & lt; 9999999 * / / * स्कैन गणना: 25 * / WHERE (खाता = 22) और (TXID & lt; 99 99 99 9) ORDER BY = ACCOUNT, 1 DESC LIMIT 25 / * इंडेक्स क्रमबद्ध * /  

जो में केवल 25 की स्कैन गणना है):


Comments

Popular posts from this blog

python - Overriding the save method in Django ModelForm -

html - CSS autoheight, but fit content to height of div -

qt - How to prevent QAudioInput from automatically boosting the master volume to 100%? -