2012-07-10 20 views
8

मुझे किसी कीवर्ड के आधार पर कुछ डेटा लाने की आवश्यकता है, क्वेरी का परीक्षण 100% सटीक है, लेकिन समस्या यह है कि reader की लोडिंग बहुत धीमी है। मैंने इस क्वेरी को उस स्थान से बदलने की कोशिश की है जिसमें inner join एस नहीं है और लोडिंग बहुत तेज थी। तो मुझे आश्चर्य है, क्योंकि परिणामस्वरूप मैं केवल एक कॉलम का चयन कर रहा हूं, डेटाटेबल.लोड() इतना समय क्यों लेता है? क्या यह SQLite का ExecuteReader है जो पूरे परिणाम लोड करता है न केवल एक कॉलम?डेटाटेबल रीडर लोडिंग बहुत धीमी है

डेटाटेबल का उपयोग करने से पहले, प्रत्येक reader.Read() निष्पादित करने का औसत समय 7 सेकंड था। मुझे लगता है कि इस SQLite की वजह से एक प्रकृति और जुड़ जाता है की बड़ी संख्या होता

_database.Connect(); 

var selectCommand = new SQLiteCommand(
@"SELECT A.ID AS MY_ID FROM MD 
INNER JOIN TMD ON MD.ID = TMD.ID_MD 
INNER JOIN TR ON TR.ID = TMD.ID_TR 
INNER JOIN P ON P.ID = TR.ID_P 
INNER JOIN DP ON DP.ID_P = P.ID 
INNER JOIN CD ON CD.ID = DP.ID_CD 
WHERE CD.DESC = @desc" 
); 

selectCommand.Parameters.AddWithValue("@desc", value); 

using (DbDataReader reader = _database.ExecuteQuery(selectCommand)) 
{ 
    DataTable data = new DataTable("MyData"); 
    data.Load(reader); 
} 
_database.Disconnect(); 
+1

ऐसा लगता है कि आपकी क्वेरी बस धीमी है। क्या आपकी टेबलों तक पहुंचने का कोई अलग तरीका है कि आपको इतना से जुड़ने की ज़रूरत नहीं है? – Tejs

+0

मुझे पता था कि यह चोट पहुंचाएगा .. दुर्भाग्य से हमें फ़ील्ड में से किसी एक के आधार पर 2 टेबल कनेक्ट करने की आवश्यकता है। मौजूदा डीबी स्कीमा को देखते हुए ये जुड़ना उनके बीच एकमात्र कनेक्शन है। – iCantSeeSharp

+0

'_डेटाबेस' क्या है और इसमें 'कनेक्ट' और' डिस्कनेक्ट 'जैसी विधियां क्यों हैं? पहिया को पुन: पेश न करें। आपको अपने कनेक्शन के लिए 'उपयोग-कथन' का भी उपयोग करना चाहिए ताकि यह सुनिश्चित किया जा सके कि इसे जितनी जल्दी हो सके "बंद" हो। क्या यह एएसपी.नेट जैसे बहुमत वाले वातावरण है? –

उत्तर

2

The SQLite Query Planner SQLite के लिए क्वेरी ऑप्टिमाइज़ेशन के बारे में कुछ संकेत प्रदान करता है।

कुछ आइटम है कि आपके सवाल का आवेदन कर सकते हैं

:

SQLite का वर्तमान क्रियान्वयन का उपयोग करता है केवल:

1.) SQLite में कार्यान्वयन के कारण आप फिर से आदेश करने के लिए कई मिलती कोशिश कर सकते हैं पाश जुड़ता है यह कहता है, जुड़ने को नेस्टेड लूप के रूप में लागू किया जाता है। में निहित लूप का डिफ़ॉल्ट क्रम FROM खंड में बाईं ओर सबसे अधिक तालिका के लिए बाहरी लूप बनाने के लिए बाहरी लूप और दाएं-अधिकांश तालिका का निर्माण करता है।

तो, जॉइन के निर्माण के तरीके के आधार पर प्रदर्शन में एक अंतर हो सकता है।

SQLite यह स्वचालित रूप से अनुकूलन करने के लिए कोशिश करता है, लेकिन जहाँ तक मैं प्रलेखन समझा वहाँ सफलता के लिए कोई गारंटी नहीं है (मेरे द्वारा डाला):

हालांकि, SQLite घोंसला अगर कर भिन्न क्रम में छोरों होगा इसलिए बेहतर सूचकांक चुनने में मदद करेगा। [...] पुनर्वितरण में शामिल हों स्वचालित है और आमतौर पर पर्याप्त काम करता है कि प्रोग्रामर इसके बारे में सोचने की ज़रूरत नहीं है, खासकर यदि उपलब्ध सूचकांक के बारे में आंकड़ों को इकट्ठा करने के लिए ANALYZE का उपयोग किया गया है। लेकिन कभी-कभी प्रोग्रामर से कुछ संकेतों की आवश्यकता होती है।

2.) कृपया यह भी नोट मिलती है कि भीतर आंतरिक रूप से जहां खंड है, इसलिए में प्रदर्शन टिप्स कहां दस्तावेज़ के अनुभाग लागू हो सकता है, बहुत से किसी में बदला जाता है: पर

और अनुच्छेद 1.0 में ऊपर वर्णित WHERE क्लॉज विश्लेषण से पहले WHERE क्लॉज के अतिरिक्त शर्तों को में परिवर्तित करने के रूप में परिवर्तित किया जाता है। इस प्रकार SQLite के साथ, पुराने SQL89 अल्पविराम-सम्मिलित वाक्यविन्यास पर नए SQL92 शामिल वाक्यविन्यास का उपयोग करने के लिए कम्प्यूटेशनल लाभ नहीं है।वे दोनों आंतरिक जोड़ों पर एक ही चीज़ को ठीक से पूरा करने के अंत में समाप्त होते हैं।

3.) अगर वहाँ उन पर किसी भी अनुक्रमित रहे हैं आप अपने बयान में अधिक स्तंभों का चयन करने की सोच सकते हैं:

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

+0

सभी जॉइन प्राथमिक कुंजी पर बनाए जाते हैं, मुझे लगता है कि यह अनुक्रमण के बारे में समस्या हल करता है, लेकिन मैं वास्तव में सोचने की कोशिश कर रहा हूं कि 1 + 2 मेरे मामले के लिए जीवन बचतकर्ता हो सकता है या नहीं। – iCantSeeSharp

+0

मैंने अपने एसक्यूएल कमांड से पहले 'ANALYZE' का उपयोग किया था और क्वेरी को बहुत तेज निष्पादित किया गया था। इसलिए, इस विशिष्ट समस्या के लिए आपने सही दिशा प्रदान करने पर विचार करते हुए, आपको जवाब मिल गया। धन्यवाद! – iCantSeeSharp

3

:

यह मेरा कोड है।

डेटाबेस योजना को पुन: सक्रिय करने का प्रयास करें, जैसे तेज़ पहुंच के लिए डेटा को denormalize।

+0

क्या "SQLite की प्रकृति" का अर्थ है कि अपेक्षित परिणाम वर्तमान में लौटने से अलग हैं? – iCantSeeSharp

+0

@Souvlaki: मेरा मतलब है कि SQLite इस तरह की संख्या में शामिल होने के लिए एक अच्छा भार का समर्थन नहीं करता है, आपके पास एक बड़ी फ़ाइल भी हो सकती है जो परिणामस्वरूप स्थायीता को भी कम कर देती है। – abatishchev

+0

भले ही क्वेरी Navikat पर बहुत तेज है? – iCantSeeSharp

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