関連する部分の私のデータベーススキーマは、ブールフィールドAdminを持つUserというテーブルがあります。このフィールドAdminにインデックスがありました。
完全な本番データベースを開発マシンに復元し、データベースにごくわずかな変更を加えただけだったので、それらは非常に似ているはずでした。
開発マシンで次のコマンドを実行すると、期待どおりの結果が得られました。
EXPLAIN SELECT * FROM user WHERE admin IS TRUE;
Index Scan using index_user_on_admin on user (cost=0.00..9.14 rows=165 width=3658)
Index Cond: (admin = true)
Filter: (admin IS TRUE)
ただし、実稼働マシンでまったく同じコマンドを実行すると、次のようになります。
Seq Scan on user (cost=0.00..620794.93 rows=4966489 width=3871)
Filter: (admin IS TRUE)
したがって、クエリに完全に一致する完全なインデックスを使用する代わりに、約500万行のシーケンシャルスキャンを使用していました。
EXPLAIN ANALYZE SELECT * FROM user WHERE admin IS TRUE;
次に、Postgresに500万行のシーケンシャルスキャンがインデックスを使用するほど良くないことを認識させることを期待して実行しようとしましANALYZE
たが、それでも何も変わりませんでした。
REINDEX INDEX index_user_on_admin
また、インデックスが破損した場合に備えて、何のメリットもなく実行しようとしました。
最後に、私は電話VACUUM ANALYZE user
をしました、そしてそれは短い順序で問題を解決しました。
真空についての私の主な理解は、それが無駄なスペースを取り戻すために使用されるということです。何が起こっていたので、インデックスの動作が非常に悪くなり、なぜ掃除機で修正されたのでしょうか。