我有一个程序可以在 SQL 查询中进行一些数学运算。SQLite 表中有数十万行(一些设备测量值),使用此查询,应用程序将这些测量值分成一组,例如 10000 条记录,并计算每组的平均值。然后它返回每个组的平均值。
查询如下所示:
SELECT strftime('%s',Min(Stamp)) AS DateTimeStamp,
AVG(P) AS MeasuredValue,
((100 * (strftime('%s', [Stamp]) - 1334580095)) /
(1336504574 - 1334580095)) AS SubIntervalNumber
FROM LogValues
WHERE ((DeviceID=1) AND (Stamp >= datetime(1334580095, 'unixepoch')) AND
(Stamp <= datetime(1336504574, 'unixepoch')))
GROUP BY ((100 * (strftime('%s', [Stamp]) - 1334580095)) /
(1336504574 - 1334580095)) ORDER BY MIN(Stamp)
这个请求中的数字被我的应用程序替换为一些值。我不知道我是否可以进一步优化这个请求(如果有人可以帮助我这样做,我真的很感激)..
可以使用 SQLite 命令行 shell (sqlite3.exe) 执行此 SQL 查询。在我的 Intel Core i5 机器上,需要 4 秒才能完成(数据库中有 100000 条记录正在处理中)。
现在,如果我使用 sqlite.h C 接口编写 C 程序,我将等待 14 秒以完成完全相同的查询。这个 C 程序在这 14 秒内“等待”第一个 sqlite3_step() 函数调用(任何随后的 sqlite3_step() 调用都会立即执行)。
我从Sqlite 下载页面下载了 SQLite 命令行 shell 的源代码并使用 Visual Studio 2008 构建它。我运行它并执行了查询。又是 14 秒。
那么为什么从 sqlite 网站下载的预构建的命令行工具只需要 4 秒,而我构建的相同工具的执行时间要长 4 倍呢?
我正在运行 Windows 64 位。预建工具是一个 x86 进程。它似乎也没有经过多核优化——在任务管理器中,在查询执行期间,我只能看到一个核心繁忙,无论是由我构建的还是预构建的 SQLite shell。
有什么方法可以让我的 C 程序像预建的命令行工具一样快地执行这个查询?
谢谢!