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)
このリクエストの数値は、アプリケーションによっていくつかの値に置き換えられます。このリクエストをさらに最適化できるかどうかはわかりません(誰かがそうするのを手伝ってくれるなら、本当に感謝しています)..
この SQL クエリは、SQLite コマンド ライン シェル (sqlite3.exe) を使用して実行できます。私の Intel Core i5 マシンでは、完了するまでに 4 秒かかります (データベースには 100000 レコードが処理されています)。
ここで、sqlite.h C インターフェイスを使用して C プログラムを作成すると、まったく同じクエリが完了するまで 14 秒待機します。この C プログラムは、最初の sqlite3_step() 関数呼び出しでこの 14 秒間「待機」します (後続の sqlite3_step() 呼び出しはすぐに実行されます)。
Sqlite ダウンロード ページからSQLite コマンド ライン シェルのソース コードをダウンロードし、Visual Studio 2008 を使用してビルドしました。それを実行し、クエリを実行しました。再び14秒。
では、sqlite の Web サイトからダウンロードしたビルド済みのコマンド ライン ツールは 4 秒しかかからないのに、私がビルドした同じツールの実行には 4 倍の時間がかかるのはなぜでしょうか?
Windows 64 ビットを実行しています。ビルド済みツールは x86 プロセスです。また、マルチコアに最適化されていないようです-タスクマネージャーでは、クエリの実行中に、自分で構築したSQLiteシェルと事前に構築されたSQLiteシェルの両方で、1つのコアのみがビジーであることがわかります。
ビルド済みのコマンド ライン ツールと同じ速度で C プログラムにこのクエリを実行させる方法はありますか?
ありがとう!