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