2016-09-20 8 views
0

私は、データ、connected_id(センサー)とタイムスタンプを含む測定データを持つテーブルを持っています。この表では、特定のセンサーの最初のタイムスタンプを探しています。いくつかのセンサーでは2msで結果が得られますが、他のセンサーでは数秒で完了します。また、特定のセンサーを検索するwhere条件を削除すると、結果はms以内になります。異なるパフォーマンスを持つpostgresqlクエリと同じ

screen shot with <code>EXPLAIN ANALYZE</code> output

両方のクエリが同じ計画を使用して、PostgreSQLの8.4を使用して、同じサーバー上で実行されます。私はすでにデータベース上で真空解析を行い、postgresql.confファイルのクエリプランを使って遊んでいました。

作成したconnected_idとこれらの両方の列の両方でbtreeインデックスとハッシュインデックスを試しました。これは何の違いもありません。

+6

テキストをスクリーンショットしないで、ここにテキストとして貼り付けます。 – oals

+0

インデックス 'data_index'はどのように定義されていますか? – donkopotamus

+0

また、データの量にもよります。両方の条件セットの 'count(*)'は何を返しますか? – Rahul

答えて

0

選択したクエリプランは、createdのインデックスを昇順で検索し、一致する最初の行が見つかったら停止します。connected_id

今すぐconnected_id = 19と低い行のあるcreatedがあるため、すぐに一致が見つかります。

しかし明らかに、connected_id = 26のすべての行はかなり高いcreatedです。したがって、一致が見つかる前にクエリで多くのインデックスエントリをスキャンする必要があります。

その違いを説明します。
最近サポートされていない、サポートされていないバージョンのPostgreSQLを使用した場合、EXPLAIN (BUFFERS)など、何が起きているかを示すためにさらに多くの診断を使用できます。

(connected_id, created)に複数列のインデックスを作成して、このクエリを高速化します。

+0

ありがとうございます。私は '(created、connected_id)'に複数列のインデックスを試しました。 connected_idの最初の注文は理にかなっています。試して結果を知らせます。 – slonkie

関連する問題