2017-03-23 15 views
0

私は約15の異なる列を持つ数億レコードのテーブルを持っています。データは、タイムスタンプ、追跡される車両上のID、および速度記録と共に、速度記録の中でも特に重要である。 1台の車両に何十万もの速度記録を持たせることができ、約40,000台の車両が存在する。SQLite max()クエリを最適化する

1台の車両ごとに最高速度記録を探したいと思います。

だけで照会:

SELECT userid, max(speed) from SpeedReadings group by userid 

は多くの時間がかかるので、私はこれを最適化したいです。私の最初の考えは、ユーザーIDと速度でインデックスを作成することです。クエリ内の変数とインデックステーブルの順序は重要ですか?データベースがないようにグループ分けを最適化するための最善の方法は、ユーザーIDによってソートされたリストに格納されたデータを持つことである

SELECT userid, max(speed) from SpeedReadings group by userid 

SELECT distinct userid, max(speed) from SpeedReadings 

答えて

1

は、これらの2つのクエリの間にそこの速度差でありますすべての可能な結果を​​維持する必要があります。 つまり、インデックスが必要です。useridが最初の列です。

計算をさらに高速化するには、列をインデックスに追加してcovering indexを取得します。

クエリの列の順序は関係ありません。

クエリSELECT distinct userid, max(speed) from SpeedReadingsとは速度が異なりますが、正しい結果を得たいと思うので違いはありません。

+0

ありがとうございます。私は、グループが正しい結果をレンダリングすることを期待しています。 – bjornasm

+0

ところで、カバリングインデックスについて言及すると、ユーザIDとスピードの両方を持つマルチカラムインデックスを意味します。 – bjornasm

+0

はい、それは私がその文章の最初の部分に書いたものです。 –