0
votes

My table in the CoreData has like 8 columns, all are strings. The largest string's length is less than 10K.

First, I use the following codes to retrieve the rows:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(URL ==[c] %@)", url]];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Time" ascending:NO selector:nil];
NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:descriptors];
[sortDescriptor release];

NSError *error = nil;
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];

Here is the performance log:

2011-05-10 11:47:18.743 Test2[2176:5907] CoreData: annotation: sql connection fetch time: 2.6172s

2011-05-10 11:47:21.600 Test2[2176:5907] CoreData: annotation: total fetch execution time: 2.8577s for 144 rows.

144 rows for more than 2 secs?

Then I construct an non-coredata object for each row:

if ([array count] > 0) {
    for (Item *item in array) {
        SimpleItem *sitem = [[SimpleItem alloc] init];
        sitem.Title = item.Title;
        sitem.Summary = item.Summary;
        sitem.URL = item.URL;
        [dataDict setObject:sitem forKey:item.URL];
        [sitem release];
    }
    [dataDict release];
}

part of The performance log ( i think for one row read) for the above codes is:

2011-05-10 11:47:21.617 Test2[2176:5907] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZURL, t0.ZSUMMARY, , t0.ZIMAGEURL, t0.ZTITLE, t0.ZURL, t0.ZTIME FROM ZITEM t0 WHERE t0.Z_PK = ?

2011-05-10 11:47:21.629 Test2[2176:5907] CoreData: annotation: sql connection fetch time: 0.0098s

2011-05-10 11:47:21.633 Test2[2176:5907] CoreData: annotation: total fetch execution time: 0.0162s for 1 rows.

It seems faults are there.

Anyone can help me to improve the performance?

Also, I have checked "Index" option for URL when I edit the data model in xcode. Is that enough for setting up an index?

1
More details are needed to provided any useful answer. - Denis de Bernardy
@Denis, yes, I updated my question - Jack

1 Answers

0
votes

It sounds like you haven't used any indexes on your columns, that might help speed things up a little but if you're searching strings 10K in length, CoreData probably isn't the way to go.

And CoreData isn't a database - it deals with some things less efficiently that just using sqlite. In CoreData, objects are completely loaded into memory for some operations - loading 10K * 144 records into memory probably won't be the fastest thing in the world :)

Try writing your database code in sqlite and see if it's any faster.