增加SQLite SELECT性能

时间:2012-05-24 19:10:24

标签: c++ c visual-studio-2008 sqlite

我有一个程序在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查询。在我的英特尔酷睿i5机器上完成需要4秒钟(数据库中有100000条记录正在处理中)。

现在,如果我编写一个C程序,使用sqlite.h C接口,我等待14秒才能完成相同的查询。这个C程序在第一次sqlite3_step()函数调用的14秒内“等待”(后面的任何sqlite3_step()调用都会立即执行。)

Sqlite download page我已下载SQLite命令行shell的源代码并使用Visual Studio 2008构建它。我运行它并执行查询。再过14秒。

那么为什么从sqlite网站下载的预编译命令行工具只用了4秒钟,而由我构建的同一工具需要4倍的执行时间?

我正在运行Windows 64位。预构建工具是x86进程。它似乎也没有多核优化 - 在任务管理器中,在查询执行期间,我只能看到一个核心繁忙,对于我的内置和预构建的SQLite shell。

我能以任何方式让我的C程序像预建的命令行工具一样快地执行此查询吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您是否在查询之前和之后记录了时间戳?很难知道你的程序在哪里被忽视而没有看到代码。