clusterコマンドでシーケンシャルスキャンが劇的に速くなるのはどうして?
vacuum analyze や reindex をしても大して速くならないシーケンシャルスキャンが、cluster コマンドを発行してみると劇的に速くなることがある。
が、どうして速くなるのか、その仕組みが分からない。
clusterするインデックスは何でもいいようだ。例えば主キーのインデックスについて
cluster <主キーのインデックス名> on <テーブル名>
を発行し、
select * from <テーブル名>
すると、2桁ぐらい(例えば10秒 -> 0.5秒)速くなることがある*1。
実行計画が変わっているわけではない。全件読んでるだけだから当然だが、間違いなく "Seq Scan" のままだ。
大部分のレコードを返すようなクエリがあって、どうしてもシーケンシャルスキャンが使われるテーブルは、定期的に cluster しておくと効果があるのではないかと思うが、どうして速くなるのか、どなたかご存知ありませんか。
*1:OLTPでたくさん更新がかかったテーブルであることが必要条件