group by句を
含むクエリを実行しようとしています。
クエリは 0.012243 秒で実行されますが、[resultset next]
を実行すると、最初に呼び出されるときに 5 秒以上かかります。
例
NSMutableArray *recordsArray = [[NSMutableArray alloc] init];
NSString * query = @"select count(id), SUBSTR(purchase_date, 0,11) as purchase_date from sales where purchase_date LIKE '2012-12%' group by purchase_date order by purchase_date asc";
NSDate * date1 = [NSDate date];
FMResultSet * resultset = [database executeQuery:query];
NSDate * date2 = [NSDate date];
NSTimeInterval timeTaken = [date2 timeIntervalSinceDate:date1];
NSLog(@"TimeTaken: %f", timeTaken); //outputs around 0.012
while ([resultset next])
{
[recordsArray addObject:[resultset resultDictionary]];
}
date2 = [NSDate date];
timeTaken = [date2 timeIntervalSinceDate:date1];
NSLog(@"TimeTaken 2: %f", timeTaken); //outputs around 5.5 seconds
また、かかった時間はすべて[resultset next]が最初に呼び出されたときであると判断できました。
また、次のようなUNIONのクエリを生成することにより、クエリを変更してgroup by句を削除しようとしました
NSString * query2 = @"select * from
(
select count(id), SUBSTR(purchase_date, 0,11) as purchase_date from sales where purchase_date = 2012-12-01
UNION
select count(id), SUBSTR(purchase_date, 0,11) as purchase_date from sales where purchase_date = 2012-12-02
UNION
select count(id), SUBSTR(purchase_date, 0,11) as purchase_date from sales where purchase_date = 2012-12-03
....
UNION
select count(id), SUBSTR(purchase_date, 0,11) as purchase_date from sales where purchase_date = 2012-12-31
) where purcase_date is not NULL order by purchase_date asc";
このクエリの実行にも 0.2 秒かかりますが、[resultset next] への最初の呼び出しと時間は 7 秒以上かかります。
その他の情報
テーブルには現在 8000 行以上ありますが、一部のユーザーの場合、その数は 100K に達する可能性があります。
このデータを使用して、特定の月の売上傾向のグラフをプロットしています。
シミュレーターでは、このクエリは 0.5 秒未満で実行されますが、デバイスではかなりの時間がかかります。
質問
このクエリの時間を短縮する方法を教えてもらえますか?