6

センサーの読み取り値を保持する単純な SQLite データベースをセットアップしています。テーブルは次のようになります。

sensors  
 - id (pk) 
 - name  
 - description
 - units  

sensor_readings  
 - id (pk)  
 - sensor_id (fk to sensors)  
 - value (actual sensor value stored here)
 - time (date/time the sensor sample was taken)

このアプリケーションは、約 30 の異なるセンサーから 1 か月あたり約 100,000 のセンサー読み取り値をキャプチャします。すべてのセンサー読み取り値をできるだけ長く DB に保持したいと考えています。

ほとんどのクエリはフォームになります

SELECT * FROM sensor_readings WHERE sensor_id = x AND time > y AND time < z

このクエリは通常、約 100 ~ 1000 件の結果を返します。

問題は、上記のクエリに時間がかかりすぎる (標準の PC で数秒以上かかる) 前に、sensor_readings テーブルをどれだけ大きくできるかということです。

センサーごとに個別の sensor_readings テーブルを作成することが 1 つの解決策になる可能性があることはわかっていますが、不要な場合はこれを避けたいと思います。この DB スキーマを最適化する他の方法はありますか?

4

4 に答える 4

4

クエリで使用する場合はtime、インデックスを追加する価値があります。それがあなたの情報に基づいて私が提案する唯一の最適化でしょう。

1か月あたり100,000回の挿入は、1分あたり約2.3に相当するため、別のインデックスがそれほど面倒になることはなく、クエリが高速化されます。30個のセンサーすべてで100,000回の挿入であり、各センサーで100,000回ではないと想定していますが、間違っていても、1分あたり70回の挿入で問題ありません。

パフォーマンスが問題になる場合は、古いデータを履歴テーブルにオフロードし(たとえばsensor_readings_old)、非履歴テーブルに対してのみクエリを実行するオプションがあります(sensor_readings)。

そうすれば、通常のクエリに影響を与えることなく、少なくともすべてのデータを利用できるようになります。本当に古いデータを取得したい場合は、そうすることができますが、そのためのクエリには時間がかかる場合があることに注意してください。

于 2008-10-09T08:03:01.000 に答える
2

インデックスを正しく設定していますか?それとhttp://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.htmlを読むことに加えて、唯一の答えは「自分で測定する必要があります」です-特にこれはハードウェアとインメモリデータベースまたはディスク上で使用しており、トランザクションで挿入をラップするかどうか。

そうは言っても、数万行の後に顕著な遅延が発生しましたが、それはまったく最適化されていませんでした-少し読んだところ、適切なインデックスなどを持つ何百もの行を持つ人がいるという印象を受けました. まったく問題のない方。

于 2008-10-09T06:40:30.340 に答える
1

私はこれに遅れて来ることを知っていますが、後でこの質問を見に来る人にとってこれは役立つかもしれないと思いました:

SQLite は、一度に 1 つのアプリケーション/ユーザーにのみサービスを提供している限り、読み取りが比較的高速になる傾向があります。複数のユーザーまたはアプリケーションが同時にアクセスすると、同時実行とブロックが問題になる可能性があり、MS SQL Server のようなより堅牢なデータベースは、同時実行の多い環境でより適切に機能する傾向があります。

他の人が言ったように、読み取りクエリの速度が気になる場合は、間違いなくテーブルにインデックスを付けます。あなたの特定のケースでは、おそらく id と time の両方を含む 1 つのインデックスを作成します。

また、書き込み速度にも注意を払う必要があります。挿入は高速ですが、コミットは遅いため、コミットする前に多くの挿入を 1 つのトランザクションにまとめてバッチ処理することをお勧めします。これについては、http ://www.sqlite.org/faq.html#q19 で説明しています。

于 2012-02-06T23:39:31.603 に答える
1

SQLite は R ツリー インデックス ( http://www.sqlite.org/rtree.html ) をサポートするようになりました。これは、多くの時間範囲クエリを実行する場合に最適です。

トム

于 2008-10-13T10:24:29.907 に答える