我反复执行相同的查询,有时查询速度很快,而其他时候则需要更长的时间。有人知道是什么原因造成的吗?
我有一个内容提供程序,可以通过我的活动的加载程序进行访问。
它必须将10,000多个条目过滤到数据库中,并且我已经对其进行了优化,以减少查询时间。
查询通常在0到30毫秒内运行。每当我执行查询时都会打印出信息。
但是我现在注意到有更多的数据,有时查询将运行得非常快,而其他时候则需要3-5秒。使用与快速执行相同的选择/查询/参数。
日志显示以下时间:和查询完全相同。
Query took 15ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 15ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3499ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3502ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 18ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 6ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3618ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
Query took 3601ms to complete SELECTION: Rows: 3 :: type != ? sel args: [0]
我在提供者中将以上日志记录为此类
queryBuilder.setProjectionMap(projectionMap);
long start = System.currentTimeMillis();
retCursor = queryBuilder.query(mOpenHelper.getReadableDatabase(), null,
selection,
selectionArgs,
null,
null,
null, null);
//This goes with the log statement, to prevent a null pointer on selectionArgs
if (selectionArgs == null) {
selectionArgs = new String[]{"null"};
}
Log.d(LOG_TAG, "Query took " + (System.currentTimeMillis() - start) + "ms to complete SELECTION:" +
" Rows: " + retCursor.getCount() +
" :: " + selection + " sel args: " + Arrays.toString(selectionArgs));
编辑:我从中提取的表有500万行。但是我在带有标志的列中插入了一个标记,以指示它是否是为特定用户插入的最后一条记录。并将其编入索引。这使我能够非常迅速地为每个用户的最后一个职位排行。新位置将删除旧位置上的标志,并插入设置了标志的新位置。我可以在不到20毫秒的时间内查询该表,也可以在大约2.5秒或更长时间内查询该表。现在似乎发生了大约30-40%(最长时间)的情况。