2010-12-08 11 views
5

मैं एंड्रॉइड प्रोग्रामिंग के लिए नया हूं, हालांकि मैं SQLite डेटाबेस के साथ काम करने में काफी उपयोग कर रहा हूं।गरीब SQLite कार्यान्वयन? पहली बार डेटा एक्सेस रास्ता बहुत धीमा

  • मेरा आवेदन एसडी कार्ड पर एक SQLite3 डेटाबेस को खोलता है और एक अपेक्षाकृत जटिल क्वेरी चलाता है (5 मिलती है, 1 सबक्वेरी, 2 जहां खंड) का उपयोग कर SQLiteDatabase.rawQuery

    public Cursor queryDataBase(String sql, String[] selectionArgs){ 
        Cursor c = myDB.rawQuery(sql, selectionArgs); 
        return c; 
    } 
    
  • SQL विवरण द्वारा दिया जाता है एक हार्डकोडेड String

  • क्वेरी 24 कॉलम के साथ 585 पंक्तियां लौटाती है।
  • मैं संग्रहण स्थान और अनुक्रमण के बीच एक व्यापार बंद करना पड़ा है, लेकिन सभी बड़ी मेज पर (के बारे में ~ 40 000 प्रविष्टियों, अभी) अनुक्रमित उपयोग किया जाता है, SQLite क्वेरी के लिए पता चलता है: Steps: 155 , Sorts: 0, AutoIdx: 1077
  • मैं नहीं कर रहा हूँ प्राथमिक कुंजी का उपयोग करके, इस प्रकार मैंने "_id" में कुछ भी नाम नहीं बदला।

  • कच्चेQuery का निष्पादन अपेक्षाकृत तेज़ है, निष्पादन समय लगभग 2 एमएस है।

  • इस डेटा तक पहुंचने से बहुत अधिक समय लगता है, उदा। c.moveToFirst() द्वारा, निष्पादन समय लगभग 1700 एमएस है! (Cursor.getRowCount() के लिए, या स्पष्ट रूप से वास्तविक परिणाम सेट तक पहली बार पहुंच)।
  • एक पीसी (2 गीगा, 1 जीबी रैम, सैटा 2 एचडीडी) पर ऐसा करना उदाहरण के साथ SQLiteSpy परिणाम सेट प्रदर्शित करने के लिए 15 एमएस लेता है।
  • इसे सी ++ कार्यान्वयन के साथ पीसी पर करना यह 15 एमएस तक 30 एमएस है।

तो मैं यहां क्या खो रहा हूं? क्या यह वास्तव में संभव है कि 800 मेगाहट्र्ज, 2 जीबी रैम के साथ मेरा हैंडसेट, माइक्रोएसडी लगभग 120 गुना धीमा है?

+0

एसडी एक बहुत भी आईडीई की तुलना में धीमी है। –

+0

मुझे पता है ... मेरी पोस्ट अन्यथा – carbi84

+0

ओह और बीटीडब्ल्यू ध्वनि के इरादे से नहीं थी ... भले ही मुझे पता है कि एमुलेटर रनटाइम्स वास्तव में कुछ भी नहीं कहता है, लेकिन क्या एम्यूलेटर एसडी कार्ड की गति को ध्यान में रखता है? मुझे नहीं पता, लेकिन मुझे नहीं लगता ... वैसे भी, एम्यूलेटर पर रनटाइम लगभग 10 सेकंड (10 000 एमएस) है, एचडीडी पर! – carbi84

उत्तर

1

पीसी के मुकाबले थोड़ा धीमा होने के बावजूद, समस्या अनइंडेक्ड फ़ील्ड का संचालन प्रतीत होती है।

जबकि मेरी मूल पोस्ट में कॉन्फ़िगरेशन लगभग 120 गुना धीमा था, मैंने इसे एक पूर्ण अनुक्रमित डेटाबेस (जिसका अर्थ है कि जहां कहीं भी आवश्यक हो वहां इंडेक्स अंडर प्राथमिक कुंजी) और क्वेरी जो अब पीसी पर 9 एमएस लेती है, अब है "केवल" 8 गुना धीमा: निष्पादन समय लगभग 75 एमएस।

यह निश्चित रूप से अभी भी एक बहुत निराश परिणाम है, क्योंकि मैं हर समय इंडेक्स का उपयोग नहीं करना चाहता, यहां तक ​​कि वास्तव में छोटी टेबल पर भी।

2

कच्चेQuery का निष्पादन अपेक्षाकृत तेज़ है, निष्पादन समय लगभग 2 एमएस है।

इस डेटा तक पहुंचने से बहुत अधिक समय लगता है, उदा। c.moveToFirst() द्वारा निष्पादन समय लगभग 1700 एमएस है! (Cursor.getRowCount() के लिए, या जाहिर है कि वास्तविक परिणाम सेट पर पहली बार पहुंच)।

यह कुंजी है: rawQuery वास्तव में क्वेरी नहीं करता है, लेकिन पहली बार क्वेरी परिणामों का उपयोग करने की आवश्यकता होने तक देरी हो रही है।

स्रोत: http://groups.google.com/group/android-developers/browse_thread/thread/c9277225f8dbc4d1/65de841f284f09e6?lnk=gst

संबंधित मुद्दे