クエリの実行時間の違いは、最初の実行でディスクからさらに8kBブロックを読み取る必要があるためです。shared read=631496
と比較してください。 およびshared read=30359
。
PostgreSQLは、WHERE
のインデックスを使用しないことを決定します 条件ですが、ORDER BY
をサポートするインデックス 。 IN
のために注意してください WHERE
の両方に1つのインデックスを使用することはできません 条件とORDER BY
–これはWHERE
でのみ可能です =
を使用する条件 比較演算子として。
したがって、PostgreSQLは選択を行う必要があり、おそらく間違った選択をします。その統計はオプティマイザにWHERE
を満たす行が多数あることを示しているためです。 条件では、ORDER BY
の行を読み取ることを決定します WHERE
と一致しないものを注文して破棄します 100個の結果行が見つかるまで条件を設定します。残念ながら、一致する行がテーブルの先頭に近くないようであり、PostgreSQLは多くの行をスキャンする必要があります(Rows Removed by Filter: 17276154
。
WHERE
のインデックススキャンを使用するには 条件、ORDER BY
を変更します PostgreSQLがインデックスを使用できないようにするための句:
ORDER BY datetime + INTERVAL '0 seconds' DESC
ここでは複数列のインデックスを使用する必要がないため、最適なインデックスは次のようになります
CREATE INDEX ON report (sensor_id);