2012-06-23 11 views
6

मैं एक इकाई MessageObject लाने के लिए एक बहुत ही बुनियादी NSFetchRequest चला रहा हूं। मेरे पास केवल 2000 संदेश ऑब्जेक्ट हैं, और मैं उन सभी को पुनः प्राप्त करना चाहता हूं। हालांकि, कुछ अजीब कारणों से, fetch अनुरोध 10 सेकंड से अधिक समय ले रहा है!कोर डेटा फ़ेच बहुत धीमा है

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
[fetchRequest setFetchBatchSize:5]; 

और यही वह है, यह मेरा fetch अनुरोध है। मैं एक भविष्यवाणी का भी उपयोग नहीं कर रहा हूं, और इसमें 10 सेकंड लगते हैं। मैं पूरी तरह से अनजान हूं कि इसका कारण क्या हो सकता है। अगर किसी के पास कोई विचार या शुरुआती बिंदु है, तो कृपया साझा करें।

मैंने SQLite डीबगिंग लॉगिंग (-com.apple.CoreData.SQLDebug 1) को सक्षम करने का भी प्रयास किया है, लेकिन मुझे इस सरल fetch से हजारों लाइन आउटपुट मिलते हैं। क्या यह सामान्य है?

2012-06-22 19:39:59.171 myapp[81825:15e03] about to execute fetch 
2012-06-22 19:39:59.172 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK FROM ZMBNOTEOBJECT t0 ORDER BY t0.ZCREATEDATE DESC 
2012-06-22 19:39:59.178 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0061s 
2012-06-22 19:39:59.179 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0067s for 2052 rows. 
2012-06-22 19:39:59.179 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGLIKE, t0.ZISPENDINGREAD, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCREATEDATE DESC LIMIT 15 
2012-06-22 19:39:59.180 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0008s 
2012-06-22 19:39:59.181 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0018s for 15 rows. 
2012-06-22 19:39:59.182 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGLIKE, t0.ZISPENDINGREAD, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCREATEDATE DESC LIMIT 15 
2012-06-22 19:39:59.186 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0042s 
2012-06-22 19:39:59.187 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0049s for 15 rows. 
2012-06-22 19:39:59.187 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGLIKE, t0.ZISPENDINGREAD, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCREATEDATE DESC LIMIT 15 
2012-06-22 19:39:59.188 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0008s 
2012-06-22 19:39:59.189 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0014s for 15 rows. 
... (thousands of more lines similar to above) 

मैं इसे पढ़ने से बहुत परिचित नहीं हूं, लेकिन ऐसा लगता है कि यह 2067 पंक्तियों में 2052 पंक्तियां प्राप्त करता है। तो उसके बाद और सामान क्यों बनाते रहेंगे? अगर पंक्तियों को लाने के लिए अनुरोध समाप्त नहीं होना चाहिए? क्या यह डेटा या कुछ दोषपूर्ण है?

इसके अलावा, मैंने setFetchBatchSize को हटा दिया है - जो हजारों लाइनों से छुटकारा पा लिया है, लेकिन fetch अनुरोध अभी भी बहुत लंबा लगता है। यह है उत्पादन मैं: 07::

2012-06-22 20:07:25.316 myapp[8927:707] about to execute fetch 
2012-06-22 20:07:25.322 myapp[8927:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE,t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 ORDER BY t0.ZCREATEDATE DESC 
2012-06-22 20:07:26.758 myapp[8927:707] CoreData: annotation: sql connection fetch time: 1.0891s 
2012-06-22 20:07:26.763 myapp[8927:707] CoreData: annotation: total fetch execution time: 1.4407s for 4000 rows. 
2012-06-22 20:07:35.967 myapp[8927:707] finished fetching 

क्या अजीब बात यह है कि 20 में है 26.763 यह जाहिरा तौर पर यह 1.4407 सेकंड 4000 पंक्तियों के लिए ले लिया कहते हैं, लेकिन नहीं करने के लिए एक और 9 सेकंड मैं उत्पादन कह मिलता है "प्राप्त करने में कठिनाई समाप्त हो गया "(जो एक एनएसएलओजी कथन है जो [[self fetchedResultsController] performFetch:&error] के बाद प्रकट होता है) उसके साथ क्या चल रहा है?

उत्तर

2

setFetchBatchSize निकालें।

यदि आपका इरादा सब कुछ एक साथ लोड करना है, तो बस इसे हटा दें।

इसके अलावा, अगर आप सभी विशेषताओं को लोड करने की जरूरत है, जोड़ें:

fetchRequest.returnsObjectsAsFaults = NO; 

यह हर इकाई लोड और विशेषताओं बस जाएँगे।

आप केवल कुछ विशेषताओं को लोड करने के लिए चाहते हो सकता है, तो आप क्या जरूरत है का चयन करने के लिए इस का उपयोग करें:

fetchRequest.propertiesToFetch = ... 

और बस हो गया।

+0

वैसे मैं वास्तव में सब कुछ नहीं लेना चाहता हूं, मैंने परीक्षण के लिए ऐसा किया था। हकीकत में, मेरे पास एक अनुमान होगा, लेकिन केवल परीक्षण के लिए, मैं देखना चाहता था कि बिना किसी भविष्य के सभी इकाइयों को लाने में कितना समय लगेगा (क्योंकि एक भविष्यवाणी भी बहुत लंबी थी)। लेकिन setFetchBatchSize को हटाने के बाद, मुझे अब SQL लॉग की हजारों लाइनें नहीं मिलती हैं। लेकिन मैं बैच आकार रखना चाहता हूं। – Snowman

+0

यदि आप इसे रखते हैं, तो कोर डेटा को हजारों दोषों को हल करना होगा, इसलिए आपके द्वारा अनुरोध किए गए अनुरोध। यह समय की बर्बादी लेता है। –

+0

लेकिन क्या उन्हें आवश्यकता होने पर केवल दोषों को हल नहीं करना चाहिए? मेरी तालिका केवल एक समय में 4 कोशिकाओं को प्रदर्शित करती है, तो यह तुरंत हजारों वस्तुओं में क्यों दोषपूर्ण है? – Snowman

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