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)

このリクエストの数値は、アプリケーションによっていくつかの値に置き換えられます。このリクエストをさらに最適化できるかどうかはわかりません(誰かがそうするのを手伝ってくれるなら、本当に感謝しています)..

この 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 プログラムにこのクエリを実行させる方法はありますか?

ありがとう!

4

1 に答える 1

0

クエリの前後にタイムスタンプを記録しましたか? コードを見ずに、プログラムがどこで停止しているかを知るのは困難です。

于 2012-05-24T20:32:54.917 に答える