1

我有一个程序可以在 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 程序像预建的命令行工具一样快地执行这个查询?

谢谢!

4

1 回答 1

0

您是否在查询之前和之后记录时间戳?不看代码就很难知道你的程序被搁置在哪里。

于 2012-05-24T20:32:54.917 回答