【发布时间】:2013-09-04 07:14:33
【问题描述】:
我正在执行这个查询:
NSString *querySQL = [NSString stringWithFormat:@"
SELECT DISTINCT P1.ID_RUTA_PARADAS
FROM FastParadas AS P1
WHERE P1.ID_ESTACION_INIT <= %d AND
%d <= P1.ID_ESTACION_END
INTERSECT
SELECT DISTINCT P2.ID_RUTA_PARADAS
FROM FastParadas AS P2
WHERE P2.ID_ESTACION_INIT <= %d AND
%d <= P2.ID_ESTACION_END",
(int)estacionOrigen.ID_Estacion,(int)estacionOrigen.ID_Estacion,
(int)estacionDestino.ID_Estacion,(int)estacionDestino.ID_Estacion];
我想加快速度。我尝试创建一些索引,但没有任何改进。 SQLite3 是否支持索引?
数据库有 3900+ 行,这个查询必须在不到一秒的时间内重复 1800+ 次。
【问题讨论】:
-
“祝你好运。”换句话说,现在放弃。让我们考虑一下这可能花费的最少时间:N = 4K 行。每秒 1.8K 次 * (N
+ N + N + N + N = 1.8K * 20K = 3600 万次“操作”/秒. 上帝禁止你敲磁盘。或者解析查询。或者做任何事情。你必须每秒评估这样的事情 1,800 次的唯一希望是将整个表加载到内存中并使用 C 代码而不是 SQL 来执行此操作。即便如此...... -
感谢您的回答,这意味着没有内置 b-tree(用于索引),在 sqlite3 的次线性 log(n) 时间内执行查询?
-
这里的问题不是 SQLite 实现的算法复杂性,而是每秒 1,800 次查询的要求。让我这样说:如果每个查询都导致一个 I/O 操作,并且您假设磁盘访问至少花费 0.5ms(然后等待返回到运行队列顶部的延迟)在执行 I/O 操作后关闭),您已经完全在水中死去。如果您打算将其全部存储在内存中,那么为什么要使用 SQLite 呢?只需使用结构数组和“查询”通过编写 C 代码来完成这项工作。 SQLite 在这里不是正确的工具。
-
在这里,让我更直言不讳:在用户空间中做任何可能可能导致 I/O 达到 1.8KHz 的事情似乎是毫无希望的。据我估计,即使只有 5% 的操作导致 I/O,你也已经失败了(IIRC OS X 时间片是 10 毫秒。)
-
将表加载到 RAM 中并使用纯 C 语言是一个不错的选择。然后通过利用对数据的某些限制,所花费的时间大大减少了。我接近1.8K/s
标签: sql objective-c sqlite