大規模な風のシミュレーションを実行して、都市の時間風パターンを生成しています。結果は2次元の等高線の時系列である。現在、私は次のような構造2次元の時系列データをデータベース(sqlite3)に保存する最も効率的な方法
Table: CFD
id, timestamp, velocity, cell_id
1 , 2010-01-01 08:00:00, 3.345, 1
2 , 2010-01-01 08:00:00, 2.355, 2
3 , 2010-01-01 08:00:00, 2.111, 3
4 , 2010-01-01 08:00:00, 6.432, 4
.., ..................., ....., .
1000 , 2010-01-01 09:00:00, 3.345, 1
1001 , 2010-01-01 10:00:00, 2.355, 2
1002 , 2010-01-01 11:00:00, 2.111, 3
1003 , 2010-01-01 12:00:00, 6.432, 4
.., ..................., ....., .
実際にSQLite3
データベーステーブルに結果を格納してい文を作成します。
CREATE TABLE cfd(id INTEGER PRIMARY KEY, time DATETIME, u, cell_id integer)
CREATE INDEX idx_cell_id_cfd on cfd(cell_id)
CREATE INDEX idx_time_cfd on cfd(time)
(これらのテーブルの3、異なる結果変数のそれぞれがあります)
ここで、cell_id
は、都市内の場所を表すドメイン内のセルへの参照です。特定のタイムステップでどのように見えるかを知るには、この図を参照してください。
典型的なクエリでは、時間ディメンションとグループの何らかの種類の集計がcell_id
で実行されます。私は特定の時間間隔の間に各セルに平均局所風速を知りたい場合、例えば、私は、タイムスタンプの数は100から8,000まで変化させることができる
select sum(time in ('2010-01-01 08:00:00','2010-01-01 13:00:00','2010-01-01 14:00:00', ...................., ,'2010-12-30 18:00:00','2010-12-30 19:00:00','2010-12-30 20:00:00','2010-12-30 21:00:00') and u > 5.0) from cfd group by cell_id
を実行することになります。
これは小さなデータベースでは問題ありませんが、大きなデータベースでは非常に遅くなります。たとえば、私の最後のデータベースは60GB、3つのテーブル、各テーブルには222,000,000行ありました。
データを保存する方法はありますか?たとえば、次のようになります。
- 毎日別のテーブルを作成するのは意味がありますか?
- タイムステップのために別のテーブルを使用し、結合を使用する方が良いでしょうか?
- より良いインデックス作成方法はありますか?
パフォーマンスを最大限に高めるために、このquestionのすべての推奨事項を既に採用しています。
実際のデータベース構造を示してください、そしてすべてのクエリをあなたは最適化する必要があります。 –