2010-10-25 12 views
10

हमारे पास हमारे एंड्रॉइड एप्लिकेशन में लगभग 7-8 टेबल हैं जिनमें प्रत्येक के औसत पर लगभग 8 कॉलम होते हैं। डेटाबेस पर दोनों पढ़ने और लिखने के संचालन किए जाते हैं और मैं डेटाएप परत के प्रदर्शन को बढ़ाने के तरीकों को खोजने और कोशिश करने का प्रयास कर रहा हूं। तो, अब तक मैं निम्नलिखित की कोशिश की है:एंड्रॉइड एप्लिकेशन के लिए SQLite ऑप्टिमाइज़ेशन

  1. उपयोग स्थितीय में तर्क जहां खंड (कारण: इतना है कि SQLite एक ही कार्य योजना लागू का उपयोग करता है): हर db आपरेशन
  2. आवेषण और लेनदेन के साथ अद्यतन संलग्न करें (कारण डिफ़ॉल्ट रूप से एक लेनदेन के भीतर संलग्न है। ऐसा करने से उस ओवरहेड को हटा दिया जाएगा)
  3. इंडेक्सिंग: मैंने प्राथमिक कुंजी और अद्वितीय कुंजी कॉलम पर डिफ़ॉल्ट रूप से बनाए गए लोगों के अलावा कोई स्पष्ट अनुक्रमणिका नहीं बनाई है। (कारण: अनुक्रमण समय तलाशने में सुधार करेगा)

मेरे पास है paranthesis में मेरी धारणाओं को entioned; अगर मैं गलत हूं कृपया मुझे सही।

सवाल:

  1. मैं इस सूची में कुछ और जोड़ सकते हैं? मैंने कहीं पढ़ा है कि डीबी-जर्नल के उपयोग से परहेज अपडेट के प्रदर्शन में सुधार कर सकते हैं? क्या यह एक मिथक या तथ्य है? यदि यह अनुशंसित किया जाए तो यह कैसे किया जा सकता है?

  2. SQLite3 में निहित लेनदेन की अनुमति है? वे प्रदर्शन को कैसे प्रभावित करते हैं? बात यह है कि मेरे पास एक ऐसा फ़ंक्शन है जो लूप में एक अद्यतन चलाता है, इसलिए, मैंने एक लेनदेन ब्लॉक के भीतर लूप को संलग्न किया है। कभी-कभी इस फ़ंक्शन को किसी अन्य फ़ंक्शन के अंदर किसी अन्य लूप से बुलाया जाता है। कॉलिंग फ़ंक्शन एक लेनदेन ब्लॉक के भीतर लूप को भी संलग्न करता है। लेनदेन के ऐसे घोंसले प्रदर्शन को कैसे प्रभावित करते हैं?

  3. मेरे प्रश्नों पर खंड जहां भविष्यवाणी बनाने के लिए एक से अधिक कॉलम का उपयोग करते हैं। ये कॉलम प्राथमिक कुंजी या अद्वितीय कॉलम से आवश्यक नहीं हो सकते हैं। क्या मुझे इन कॉलम पर इंडेक्स भी बनाना चाहिए? क्या ऐसी तालिका के लिए कई सूचकांक बनाना एक अच्छा विचार है?

उत्तर

12
  1. नीचे पिन वास्तव में जो आप अनुकूलन करने के लिए की जरूरत है प्रश्नों। एक विशिष्ट डेटाबेस की एक प्रति प्राप्त करें और समय प्रश्नों के लिए आरईपीएल का उपयोग करें। अनुकूलित करने के रूप में किसी भी लाभ को बेंचमार्क करने के लिए इसका उपयोग करें।

  2. SQLite के क्वेरी प्लानर को अधिक कुशलता से काम करने की अनुमति देने के लिए ANALYZE का उपयोग करें।

  3. SELECT और UPDATE रों के लिए, अनुक्रमित कर सकते हैं चीजों को है, लेकिन आपके द्वारा बनाए गए अनुक्रमित वास्तव में प्रश्नों है कि आप को तेज करने की जरूरत है द्वारा इस्तेमाल किया जा सकता है, तो केवल।अपने प्रश्नों पर EXPLAIN QUERY PLAN का उपयोग करके देखें कि कौन सी अनुक्रमणिका का उपयोग किया जाएगा या यदि क्वेरी को पूर्ण तालिका स्कैन की आवश्यकता है। बड़ी टेबल के लिए, एक पूर्ण टेबल स्कैन खराब है और आप शायद एक इंडेक्स चाहते हैं। किसी दिए गए प्रश्न पर केवल एक सूचकांक का उपयोग किया जाएगा। यदि आपके पास एकाधिक भविष्यवाणियां हैं, तो उस इंडेक्स का उपयोग किया जाएगा जो परिणाम को कम करने की अपेक्षा की जाती है (ANALYZE पर आधारित)। आपके पास ऐसे इंडेक्स हो सकते हैं जिनमें एकाधिक कॉलम हों (एकाधिक भविष्यवाणियों के साथ प्रश्नों की सहायता के लिए)। यदि आपके पास एकाधिक कॉलम वाले इंडेक्स हैं, तो वे केवल तभी उपयोग योग्य होते हैं जब भविष्यवाणियां बिना किसी अंतराल के बाएं से दाएं इंडेक्स तक फिट होती हैं (लेकिन अंत में अप्रयुक्त कॉलम ठीक हैं)। यदि आप ऑर्डरिंग predicate (<, <=, > आदि) का उपयोग करते हैं तो उसे इंडेक्स के अंतिम उपयोग किए गए कॉलम में होना आवश्यक है। WHERE दोनों का उपयोग करके भविष्यवाणी और ORDER BY दोनों को एक अनुक्रमणिका की आवश्यकता होती है और SQLite केवल एक का उपयोग कर सकता है, ताकि यह एक बिंदु हो जहां प्रदर्शन पीड़ित हो। आपके पास जितनी अधिक इंडेक्स हैं, धीमे आपके INSERT एस होंगे, इसलिए आपको अपनी स्थिति के लिए सबसे अच्छा व्यापार-बंद करना होगा।

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

  5. यदि आप बड़ी संख्या में INSERT एस कर रहे हैं, तो इंडेक्स छोड़ने और अंत में उन्हें पुन: प्रयास करने का प्रयास करें। आपको इसे बेंचमार्क करना होगा।

  6. SQLite does support nested transactions सेवपॉइंट्स का उपयोग करके, लेकिन मुझे यकीन नहीं है कि आपको प्रदर्शन-वार कुछ भी प्राप्त होगा।

  7. आप gain lots of speed by compromising on data integrity कर सकते हैं। यदि आप स्वयं डेटाबेस भ्रष्टाचार से पुनर्प्राप्त कर सकते हैं, तो यह आपके लिए काम कर सकता है। आप शायद ऐसा ही कर सकते हैं जब आप गहन परिचालन कर रहे हैं जिसे आप मैन्युअल रूप से पुनर्प्राप्त कर सकते हैं।

मुझे यकीन नहीं है कि आप एंड्रॉइड एप्लिकेशन से कितना प्राप्त कर सकते हैं। SQLite दस्तावेज़ में सामान्य रूप से SQLite को अनुकूलित करने के लिए more detailed guide है।

+0

इस प्रश्न का उत्तर देने के लिए समय निकालने के लिए धन्यवाद। – Samuh

1

मैं इन जोड़ना होगा:

  1. () के बजाय ContentValues ​​का उपयोग कर निर्माण कुछ मामलों में जकड़ना होगा की rawQuery का उपयोग करना। बेशक कच्चे सवाल लिखने के लिए यह थोड़ा कठिन है।

  2. यदि आपके पास बहुत सारे स्ट्रिंग/टेक्स्ट प्रकार डेटा हैं, तो पूर्ण टेक्स्ट खोज (FTS3) का उपयोग करके वर्चुअल टेबल बनाने पर विचार करें, जो तेज क्वेरी चला सकते हैं। आप सटीक गति सुधार के लिए Google में खोज सकते हैं।

8

EXPLAIN QUERY PLAN को चल रहे एंड्रॉइड ऐप से एंड्रॉइड लॉगकैट में परिणाम प्राप्त करने के लिए यहां कुछ कोड दिया गया है। मैं SQLiteOpenHelper dbHelper और SQLiteQueryBuilder qb से शुरू कर रहा हूं।

String sql = qb.buildQuery(projection,selection,selectionArgs,groupBy,having,sortOrder,limit); 
android.util.Log.d("EXPLAIN",sql + "; " + java.util.Arrays.toString(selectionArgs)); 
Cursor c = dbHelper.getReadableDatabase().rawQuery("EXPLAIN QUERY PLAN " + sql,selectionArgs); 
if(c.moveToFirst()) { 
    do { 
     StringBuilder sb = new StringBuilder(); 
     for(int i = 0; i < c.getColumnCount(); i++) { 
      sb.append(c.getColumnName(i)).append(":").append(c.getString(i)).append(", "); 
     } 
     android.util.Log.d("EXPLAIN",sb.toString()); 
    } while(c.moveToNext()); 
} 
c.close(); 

मैं अपने ContentProvider.query() में इस गिरा दिया और अब मैं देख सकता हूँ वास्तव में कैसे सभी प्रश्नों का प्रदर्शन किया जा रहा है। (मेरे मामले में ऐसा लगता है कि इंडेक्सिंग के खराब उपयोग के बजाय पर बहुत से प्रश्न हैं, लेकिन शायद यह किसी और की मदद करेगा ...)

0

रॉबी के अन्य व्यापक उत्तर में जोड़ने के लिए एक मामूली बिंदु: VFS SQLite में (जो ज्यादातर लॉकिंग से संबंधित है) विकल्पों के लिए बाहर कर दिया जा सकता है। आप यूनिक्स-एक्सक्ल या यूनिक्स-कोई भी जैसे विकल्पों में से एक को तेज़ होने के लिए SQLite VFS page पर चेतावनियों पर ध्यान दें!

Normalization (तालिका संरचनाओं का) भी विचार करने योग्य है (यदि आपने पहले से नहीं किया है) क्योंकि यह डेटाबेस में डेटा का सबसे छोटा प्रतिनिधित्व प्रदान करता है; यह एक व्यापार-बंद है, अधिक CPU के लिए कम I/O है, और वह आमतौर पर मध्यम-स्तरीय एंटरप्राइज़ डेटाबेस (जिस तरह से मैं सबसे परिचित हूं) में सार्थक है, लेकिन मुझे डर है कि मुझे नहीं पता कि क्या मुझे नहीं पता व्यापार-बंद एंड्रॉइड जैसे छोटे पैमाने पर प्लेटफार्मों पर अच्छी तरह से काम करता है।

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