2016-11-12 3 views
0

結果の行列をBLOBとしてsqlite3データベースに格納する高価なシミュレーションを実行します。この行列は、特定のtemperatureでシミュレートされた物理システムの量を表し、ある特定のboundary_conditionと特定の行列サイズsizeのものです。さらに、私はシミュレーションを終了するのに常にconvergenceまたはnumber_of_stepsのどちらかを使用します。これも保存する必要があります。私はこの行列を必要とする場合、以下のように、私は私のデータベースを照会:複数の接続されたwhere句節を持つクエリの適切な主キーとインデックス[sqlite3]

SELECT * FROM matrices 
WHERE temperature = ? AND size = ? AND boundary_condition = ? 
AND number_of_steps <= ? 
ORDER BY number_of_steps DESC LIMIT 1 

それとも

SELECT * FROM matrices 
WHERE temperature = ? AND size = ? AND boundary_condition = ? 
AND convergence >= ? 
ORDER BY convergence ASC LIMIT 1 

を今、私は主キーまたはインデックスを持っていません。ルックアップが少し遅くなってきたので、毎回フルテーブルスキャンを行っていることが分かりました。私は周りを見渡して(temperature, boundary_condition, size)の複合主キーが適切であり、number_of_stepsconvergenceのインデックスはk log(N)の複雑さをもたらし、Nは出力のサイズであり、kは出力の行であると結論付けました。

これは最適ですか?追加の複雑さは、そのような複合主キーが変更される可能性があるということです。突然、私のシミュレーションに別の必須パラメータを追加する必要がある場合は、主キーを変更する必要があります。これは問題ですか?

答えて

1

これらのクエリは、(temperature, boundary_condition, size)値が一致するすべてのテーブル行を読み取って、最大値/最小値がnumber_of_steps/convergenceの値を見つける必要があります。 (temperature, boundary_condition, size, number_of_steps)(temperature, boundary_condition, size, convergence)に2つのインデックスを付けることで、これらの特定のクエリを高速化できます。

プライマリキーの制約により、一意性が強制され、テーブル行がどのように識別されるかが文書化されます。 現時点でパフォーマンスのみが目標である場合は、簡単に削除して再作成できる別のインデックスを持つ方が簡単です。

+0

これらのインデックスを追加すると、500ルックアップの時間が12秒から0.2秒に短縮されました。 – Kappie001

関連する問題