2012-05-24 88 views
1

我有一個程序在SQL查詢中執行一些數學運算。 SQLite表中有數十萬行(某些設備度量值),並且使用此查詢,應用程序將這些度量值分成多組(例如10000條記錄),並計算每個組的平均值。然後它返回這些組中每個組的平均值。增加SQLite SELECT性能

查詢看起來是這樣的:

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) 

在申請中的數字是由我與一些值應用取代。 我不知道我是否可以優化這個請求更多(如果有人可以幫助我這樣做,我真的很感激)..

此SQL查詢可以使用SQLite命令行shell(sqlite3。可執行程序)。在我的英特爾酷睿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外殼。

任何方式,我可以讓我的C程序執行這個查詢一樣快,預構建的命令行工具呢?

謝謝!

回答

0

您是否在查詢前後記錄了時間戳?很難知道你的程序在哪裏被看到而沒有看到代碼。

+0

是的,我記錄了時間。我爲C程序執行通常的步驟:sqlite3_open(),sqlite3_prepare_v2(),while(sqlite3_step()== SQLITE_ROW){...} sqlite3_finalize()。該程序正在幫助第一個sqlite3_step()14秒..所有以下sqlite3_step()的立即執行。此外,我試圖自己編譯sqlite控制檯 - 從這個控制檯我得到同樣的低性能。從預構建控制檯查詢只需要4秒鐘執行... – user1406340