Do you have keyShadow set as indexed in the model? If not, you probably want to 
give that a try.

If you have all of the keys up front (i.e. this is a big batch update or insert 
from the Web Service data), you might consider loading all of the records at 
once and then using a predicate to find what you need. Something like:

//load all possible matches at once
NSFetchRequest *possibleEventsFetchRequest = [[NSFetchRequest alloc] 
initWithEntityName:@"MissionEvent"]; 
[possibleEventsFetchRequest setPredicate:[NSPredicate 
predicateWithFormat:@"keyShadow IN %@", allPossibleKeyShadows]];
NSArray *possibleEvents = [self.managedObjectContext executeFetchRequest: 
possibleEventsFetchRequest error:nil];

//create a filter predicate
NSPredicate *indexMatchPredicate = [NSPredicate predicateWithFormat:@"keyShadow 
== %ld", inMEP.mId];

//this now happens in memory
NSManagedObject *matchingObject = [[possibleEvents filteredArrayUsingPredicate: 
indexMatchPredicate] lastObject];

Hunter

On Nov 11, 2012, at 6:42 AM, Rick Mann <rm...@latencyzero.com> wrote:

> I'm seeing a substantial degradation in Core Data fetch performance after 
> just a few thousand objects, in the simulator on a beefy MacBook Pro.
> 
> My app loads data from the web, then uses an integer key in each downloaded 
> record to find the local record in Core Data. So I do a lot of queries like 
> this:
> 
> {
>    NSFetchRequest* req = [[NSFetchRequest alloc] init];
>    req.fetchLimit = 1;
> 
>    NSManagedObjectContext* moc = self.managedObjectContext;
>    NSEntityDescription* entity = [NSEntityDescription entityForName: 
> @"MissionEvent"
>                                              inManagedObjectContext: moc];
>    req.entity = entity;
> 
>    NSPredicate* pred = [NSPredicate predicateWithFormat: @"keyShadow == %ld", 
> inMEP.mId];
>    req.predicate = pred;
> 
>    NSError*        error = nil;
>    NSArray* events = [self.managedObjectContext executeFetchRequest: req 
> error: &error];
>    ...
> }
> 
> Basically, I query, the insert, over and over. As the number of records grows 
> from 0 to 6000, the time it takes to execute this query grows from about 
> 0.0007 s to about 0.0126 s. Indexing is on for keyShadow:
> 
> sqlite> explain query plan SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCLOCKSHADOW, 
> t0.ZDESC, t0.ZDISABLEDSHADOW, t0.ZDURATIONSHADOW, t0.ZKEYSHADOW, 
> t0.ZLASTMODIFIED, t0.ZNAME, t0.ZSEQUENCESHADOW, t0.ZTIMESHADOW, 
> t0.ZTYPESHADOW, t0.ZMISSION FROM ZMISSIONEVENT t0 WHERE  t0.ZKEYSHADOW = ?
>   ...> ;
> sele  order          from  deta
> ----  -------------  ----  ----
> 0     0              0     SEARCH TABLE ZMISSIONEVENT AS t0 USING INDEX 
> ZMISSIONEVENT_ZKEYSHADOW_INDEX (ZKEYSHADOW=?) (~10 rows)
> 
> This seems like pretty poor performance. Is this the best I can hope for?
> 
> Thanks,
> 
> -- 
> Rick
> 
> 
> 
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/cocoa-dev/lists%40lastonepicked.com
> 
> This email sent to li...@lastonepicked.com


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to